mvo指令的详解
立即数被编码到机器的低12位,如果立即数小于256,则编码到低8位,否则,如果能通过循环左移偶数位变成小于256的数,那么编码时,小于256的数在机器码的低八位,移动的位数除以2编码到低12的高四位
移位指令操作
LSL 对通用寄存器中的内容进行逻辑左移操作
LSR 对通用寄存器中的内容进行逻辑右移操作
ASR 对通用寄存器中的内容进行算数右移操作,左端是正数的话用0补齐,如果是负数的话用1补齐
ROR 对通用寄存器进行循环右移操作,左端的数用右边移出的位来补充
nt main ()
{
int a, b, c,d;
__asm__ __volatile__(
"nop\n"
"mov r0,#0x78\n" //将0x78放到寄存器r0中
"lsl %[a],r0,#0x4\n" //将寄存器r0通过左移四位的操作
"lsr %[b],r0,#0x4\n"//将寄存器r0通过右移四位的操作
"asr %[c],r0,#0x8\n" //将寄存器r0通过算数左移移四位的操作
"ror %[d],r0,#0x4\n" ////将寄存器r0通过循环右移四位的操作
"nop\n"
:[a]"=&r"(a),输出的变量
[b]"=r&"(b),
[c]"=&r"(c),
[d]"=&r"(d)
: //输入的变量
:"r0"//被更改的资源列表
);
}
算数运算逻辑指令
AND 将两个数进行逻辑与运算,常用于频闭操作数1的某些位
ORR 将两个操作数进行逻辑或运算,常用于设置操作数1的某些位
EOR 将两个操作数进行异或操作,用于反转操作数1的某些位
ADD 将两个数进行算数相加
ADC 与ADD的区别是除了两个操作数相加,还包括CPSR中的C的标志位
SUB 将两个数进行相减操作
int a, b, c,d;
__asm__ __volatile__(
"nop\n"
"mov r0,#0x78\n" //将0x78放到寄存器r0中
"and %[a],r0,#0x78\n"
"orr %[b],r0,#0x4\n"
"add %[c],r0,#0x22\n"
""
"nop\n"
:[a]"=&r"(a),
[b]"=r&"(b),
[c]"=&r"(c),
[d]"=&r"(d)
:
:"r0"
);
}
加载/存储指令
LDR 从储存器中将一个32位的字数据传到目标寄存器中
STR 将源寄存器32位数据传到储存器中
LDR 的伪指令用法
ldr r0 ,=lable//取标号处的地址送入r0
ldr r0 ,lable//取标号处的地址储存的四字节真值
ldr r0 ,=imedi //将任意一个常量立即数,放入r0,无论是否合法