汇编中的LDR、LDRB、STRB、SUBS、BNE、CMP和SUBS是什么意思?

作者&投稿:仲孙侦 (若有异议请与网页底部的电邮联系)
汇编代码 ldr r1, [r0] 是什么意思?~

从R0寄存器指向的地址中取出一个字的数据,存储到R1寄存器中

一、 参数传递的基本规则(ATPCS(ARM—Thumb Procedure Call Standard))
1、 参数传递

二、汇编程序、C程序相互调用举例
1、 C程序调用汇编程序
汇编程序的设计要遵守ATPCS(ARM—Thumb Procedure Call Standard),保证程序调用时参数的正确传递。在汇编程序中使用EXPORT 伪操作声明本程序,使得本程序可以被别的程序调用。在C程序使用extern声明该汇编程序。
下面是一个C程序调用汇编程序的例子。其中汇编程序strcopy实现字符串复制功能,C程序调用strcopy完成字符串复制的工作。
//C程序
#include
extern void strcopy(char *d, const char *s);
int main( )
{
const char *srcstr=”First string-source”;
char dststr[ ]=”Second string-destination”;
printf(“Before copying:
”);
printf(“%s
%s
”, srcstr,dststr);
strcopy(dststr,srcstr);
printf(“After copying:
”);
printf(“%s
%s
“,srcstr,dststr);
while(1) ;
}

;汇编程序
AREA Scopy, CODE, READONLY
EXPORT strcopy
Strcopy
LDRB R2, [R1], #1
STRB R2, [R0], #1
CMPR2,#0
BNE Strcopy
MOV PC, LR
END
2、 汇编程序调用C程序
汇编程序的设计要遵守ATPCS,保证程序调用时参数的正确传递。在汇编程序中使用IMPORT伪操作声明将要调用的C程序。下面是一个汇编程序调用C程序的例子。其中在汇编程序中设置好各参数的值。本例中有6个参数,分别使用寄存器R0存放第1个参数,
R1存放第2个参数, R2存放第3个参数, R3存放第4个参数, 第5个、第6个参数利用数据栈传送。由于利用数据栈传递参数,在程序调用结束后要调整数据栈指针。
//C程序g( )返回6个参数的和
int g( int a, int b, int c, int d, int e, int f )
{
printf(“e=%d
”, e);
printf(“f=%d
”, f);
return (a+b+c+d+e+f);
}

; 汇编程序调用C程序 g( ) 计算6个整数 i, 2*i, 3*i, 4*i, 5*i, 6*i的和
EXPORT f
AREA f ,CODE, READONLY
IMPORT g
MOV R0, #1
ADD R1, R0, R0
ADD R2, R1, R0
ADD R3, R2, R0
ADD R4, R3, R0
ADD R5, R4, R0
STR R4, [SP, #-4]!
STR R5, [SP, #-4]!
BL g
ADD SP, SP, #4
ADD SP, SP, #4
STOP B STOP
END

这些都是指令,cpu拿到下一条命令后根据指令表来区分命令种类和参数,然后根据该命令来执行。



http://blog.chinaunix.net/uid-20379123-id-1956584.html
http://blog.163.com/zhaoming_1986@126/blog/static/68676320200911288480828/

ARM指令集中

- LDR 字数据加载指令
-LDRB 字节数据加载指令
-STRB 字节数据存储指令
SUBS 需要借位

SUB和SBC生成进位标志的方式不同于常规,如果需要借位则清除进位标志,所以指令要对进位标志进行一个非操作。

例如:

第一个64位操作数存放在寄存器R2,R3中;

第二个64位操作数存放在寄存器R4,R5中;

64位结果存放在R0,R1中。

64位的减法(第一个操作数减去第二个操作数)可由以下语句实现:

SUBS R0,R2,R4; 低32位相减,S表示结果影响条件标志位的值

SBC R1,R3,R5; 高32位相减

CMP 比较指令

格式:CMP{<cond>} <Rn>,<op1>;

功能:Rn-op1

该指令进行一次减法运算,但不存储结果,根据结果更新CPSR中条件标志位的值。

该指令不需要显式地指定S后缀来更改状态标志。其中,操作数op1为寄存器或立即数。

例如:

LDR指令的格式为:LDR{条件} 目的寄存器,<存储器地址>

BS、BNE、CMP

这些都是指令,cpu拿到下一条命令后根据指令表来区分命令种类和参数
然后根据该命令来执行

看指令表啊


流行的缩写都有什么
中文缩写指南:1、BT:①Bit Torrent的缩写,是一种P2P(点对点)共享软件,中文译名“比特流”或“变态下载”。②“变态”的缩写。2、ZT:①“转帖”的缩写。②“猪头”的缩写,引申有ZT3,猪头三;ZT4,猪头四。 例句:青眉郑重告诉侠客社区的侠友们,ZT一定要注明。3、PP:①“片片”的缩写,...

ARM微处理器有哪几种基本寻址方式
指令中的地址码给出的是一个通用寄存器编号,所需要的操作数保存在寄存器指定地址的存储单元中,即寄存器为操作数的地址指针,操作数存放在存储器中。例如指令:LDR R0,[R1] ;R0←[R1](将R1中的数值作为地址,取出此地址中的数据保存在R0中)STR R0,[R1] ;[R1] ←R0 5.变址寻址 变址寻址...

吞音规则
①爆破音中的任何两个爆破音相邻时,前一爆破音失去爆破。如a bi(g)car等 。②爆破音中的任何一个后换摩擦音间,\/s,等时,前面的爆破音失去爆破。如l didn(t) say so .③爆破音后接、ld、t、ldr时,前面的爆破音失去爆破。如 a grea (t) change等。④爆破音后接m、m、M时,前面的爆破音...

请问arm-linux-gcc和arm-linux-ld还有arm-linux-objcopy之间是什么关...
{CROSS}ld -Ttext=0x33000000 led.o -o led.elf 使用连接脚本设置地址:arm-linux-ld -Tbeep.lds start.o beep.o -o beep.elf 其中beep.lds 为连接脚本如下:arm-linux-objcopy被用来复制一个目标文件的内容到另一个文件中,可用于不同源文件的之间的格式转换 示例:arm-linux-objcopy –o ...

编写一段ARM程序,实现数据块复制
你可以自己写一个汇编的程序,把Nand Flash 中的程序搬到SDRAM中。因为S3C2410有Nor Flash和Nand Flash...ldr r4, [r2], #4 str r4, [r1], #4 cmp r1, r3 bne 1b mov pc, lr .align 4 mem_...arm-linux-ld -Tnand.lds head.o mem.o flash.o nand_read.o sdram.o -o sdram_tmp.o arm...

arm处理器典型寻址方式有哪些
寄存器中的值作为操作数的地址,操作数本身放在存储器中;如:LDR R0,【R1】 --->R0 = 【R1】,取出R1存的地址中的值,赋给R0;5.基址变址寻址:基址寄存器的内容与指令中的偏移量相加,得到有效操作数的地址,然后访问该地址空间;分三种:1)、前索引:如:LDR R0,【R1,#4】 -...

vb和西门子s7-200 plc的通讯 监控
对于一次读多个数据的情况,前21Byte与上面相似只是长度LD,LDr及Byte 14不同:Byte 14 数据块占位字节,它指明数据块占用的字节数。与数据块数量有关,长度=4+数据块数*10,如:一条数据时为4+10=0E(H);同时读M,V,Q三个不同的数据块时为4+3*10=22(H)。Byte 22 总是02 即以Byte为单位...

HDR以及HDR相关的后处理
下面这个曲线是以log2(x)为横坐标,Ld为纵坐标所绘制的曲线,其中Lav取得值为0.18。 A. 先进行线性映射 B. 进行缩放调整,避免像素超过LDR所能表示的上限(也就是1) 这个算法对应的亮度调整曲线给出如下(横坐标为log2(Lscaled),纵坐标为Color): 这个算法对于低亮度的像素基本上是没有影响的,而对于可能会超出...

base64解码.求如下图片元地址
这是图片数据的base64编码 是整个图片的数据 不是一个地址 这个直接放进去 浏览器可以解释的

路灯选型
FT是公司名称,LD是路灯的缩写。-013是该公司产品型号,其实都是一样的,你看我们公司叫 GL-LDR-801,其实是一样的

涪陵区17598787912: ARM平台下bl和ldr指令的区别 -
博胁腾克: ARM是RISC结构,数据从内存到CPU之间的移动只能通过L/S指令来完成,也就是ldr/str指令.比如想把数据从内存中某处读取到寄存器中,只能使用ldr比如:ldr r0, 0x12345678就是把0x12345678这个地址中的值存放到r0中.而mov不能干这个...

涪陵区17598787912: STR LDRB R3,[R1],#1 在ARM汇编里如何解释 -
博胁腾克: 我怀疑你是从计算机三级嵌入式教材上看到的吧,因为我也遇到了同样的疑惑.我觉得,LDRB前面的STR应该只是个标号,指明是一个程序的分支,你可以继续往下看代码,BNE是说如果不相等则跳转到STR分支,所以STR在这里不是一个指令. 书上还有好多类似的写法,比如: 你说的STR就类似于上图中的NEXT

涪陵区17598787912: 若使用 LDRB/STRB 代替程序清单 3.2 中的所有加载/存储指令(LDR/STR),程序会得到正确的执行吗? LDR 伪指 -
博胁腾克: 会正确执行.ARM指令集中,LDR通常都是作加载指令的,但是它也可以作伪指令.LDR伪指令的形式是“LDR Rn,=expr”.作用是装在一个32bit常数和一个地址到寄存器.LDR R1,=COUNT是将COUNT这个变量的地址,也就是0x40003100...

涪陵区17598787912: 在ARM的汇编中,如何移动字节串 -
博胁腾克: 移动单个字节:ldrb r0,[r1] strb r0,[r2]

涪陵区17598787912: arm7各指令分别是多少字节啊 -
博胁腾克: ARM指令4个字节.THUMB指令2个字节.

涪陵区17598787912: 汇编语言ldrb r3, [r3, #4] 是什么意思 -
博胁腾克: 把地址为:R3+4 的寄存器的低8位保存进R3,高24位清零

涪陵区17598787912: c语言中如何调用汇编程序 -
博胁腾克: 1、如果汇编程序是可执行文件,比如exe文件,则可以使用system函数直接调用.比如下面的代码,用system()打开windows上的记事本程序.1 2 3 4 5 6 7#include <stdio.h> #include <stdlib.h> intmain() { system("notepad.exe"); return0; ...

涪陵区17598787912: 汇编语言是怎么调用c语言的程序的? -
博胁腾克: 一、 参数传递的基本规则(ATPCS(ARM—Thumb Procedure Call Standard)) 1、 参数传递二、汇编程序、C程序相互调用举例 1、 C程序调用汇编程序 汇编程序的设计要遵守ATPCS(ARM—Thumb Procedure Call Standard),保证程...

涪陵区17598787912: 请问这个汇编程序是什么意思,最好具体点.谢谢 -
博胁腾克: LDR R8, [R10] ;R10保存的是一个地址,LDR就是表示把这个地址里面的内容装载到r8 LDRNE R2, [R5,#960]!;将r5+960-->r2,同时,r5的值也变成r5+960 STR R2, [R9,#consta-struc];将寄存器r2的值装入内存r9+consta-struc的位置 STRB R0, ...

涪陵区17598787912: 如何在C语言中调用汇编函数 -
博胁腾克: 1、 参数传递 二、汇编程序、C程序相互调用举例1、 C程序调用汇编程序 汇编程序的设计要遵守ATPCS(ARM—Thumb Procedure Call Standard),保证程序调用时参数的正确传递.在汇编程序中使用EXPORT 伪操作声明本程序,使得本程序可以被别的程序调用.在C程序使用extern声明该汇编程序.下面是一个C程序调用汇编程序的例子.其中汇编程序strcopy实现字符串复制功能,C程序调用strcopy完成字符串复制的工作.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网