LDR⼀STR和MOV有什么区别?ARM中的汇编指令貌似比51单片机的复杂啊

2024-11-29 21:24:05
推荐回答(4个)
回答(1):

MOV是从一个寄存器或者移位的寄存器或者立即数的值传递到另外一个寄存器
从本质上是寄存器到寄存器的传递,为什么会有立即数,其实也是有限制的立即数,不是所有立即数都可以传递的
这个立即数要符合一个8位数循环右移偶数位的取值
原因是,MOV本身就是一条32bit指令,除了指令码本身,它不可能再带一个可以表示32bit的数字,所以用了其中的12bit来表示立即数,其中4bit表示移位的位数(循环右移,且数值x2),8bit用来表示要移位的一个基数

可以看出,并不是所有数都可以表示成一个8bit数循环右移偶数位的

LDR和STR用来存取内存,关于"索引偏移",你是不是指pre-indexed addressing和post-indexed addressing
pre-indexed addressing是指地址经过运算不写回基址寄存器
post-indexed addressing则回写到基址寄存器

比如
pre-indexed addressing:
mov r1,#0
STR r0, [r1, #0x10] ;r1+0x10这个是所用的实际地址值,但是不回写入r1,在此句之后,r1=0

post-indexed addressing:
STR r0, [r1], #0x10 ;r1+0x10这个是所用的实际地址值,这个值回写入r1,此句之后,r1=0x10

还有一点是关于ldr的,其实ldr可以装载一个32bit立即数的说法并不确切,因为实际上并不是这一条语句装载了一个32bit立即数,比如
ldr r1, =0x12345678
其实真正的汇编代码是将某个地址的值传递给r1,就是说需要一个地址存放0x12345678这个立即数,实际上可以看作是一条伪指令
而且如果这个立即数可以用mov指令的形式来表达,会被编译器实际用mov来代替
比如:
ldr r1,=0x10
会变成
mov r1,#0x10

回答(2):

LDR/STR 跟mov最大都差别是LDR/STR就是用来读跟写数据的,而mov是可以送数和读写数据...ARM的指令比较多,比51复杂,但是用C来写就差不多,就是寄存器多一点

回答(3):

ARM是哈佛结构的只用LDR和STR等访问内存指令

回答(4):

MOV是从一个寄存器或者移位的寄存器或者立即数的值传递到另外一个寄存器
从本质上是寄存器到寄存器的传递,为什么会有立即数,其实也是有限制的立即数,不是所有立即数都可以传递的
这个立即数要符合一个8位数循环右移偶数位的取值
原因是,MOV本身就是一条32bit指令,除了指令码本身,它不可能再带一个可以表示32bit的数字,所以用了其中的12bit来表示立即数,其中4bit表示移位的位数(循环右移,且数值x2),8bit用来表示要移位的一个基数
可以看出,并不是所有数都可以表示成一个8bit数循环右移偶数位的
LDR和STR用来存取内存,关于"索引偏移",你是不是指pre-indexed addressing和post-indexed addressing
pre-indexed addressing是指地址经过运算不写回基址寄存器
post-indexed addressing则回写到基址寄存器
比如
pre-indexed addressing:
mov r1,#0
STR r0, [r1, #0x10] ;r1+0x10这个是所用的实际地址值,但是不回写入r1,在此句之后,r1=0
post-indexed addressing:
STR r0, [r1], #0x10 ;r1+0x10这个是所用的实际地址值,这个值回写入r1,此句之后,r1=0x10
还有一点是关于ldr的,其实ldr可以装载一个32bit立即数的说法并不确切,因为实际上并不是这一条语句装载了一个32bit立即数,比如
ldr r1, =0x12345678
其实真正的汇编代码是将某个地址的值传递给r1,就是说需要一个地址存放0x12345678这个立即数,实际上可以看作是一条伪指令
而且如果这个立即数可以用mov指令的形式来表达,会被编译器实际用mov来代替
比如:
ldr r1,=0x10
会变成
mov r1,#0x10