目录
一、常见指令
直接给例子,应该比较好理解(我怎么一会大写一会小写的。。。),掌握这些读程序就不成问题了,写程序就是熟练度的问题,多练,多自己想。
1. 跳转:
mov r1,r2//r2内容入r1
mov r1,#1
ldr r0,=data_format
ldr r0,=0xFFFF_FFFF
ldr r0,[r1,r2]//r1地址+r2地址后的内容入r0
2. 加减(乘没遇到过,反正是一样的)
ADD r0,r0,r1
ADD r0,r0,#1
ADC r0,r0,r1//C带进位
SUB r0,r0,r1
SBC r0,r0,r1//C带借位
MUL r0,r0,r1
3. 函数跳转
BL func_1
b main_func//main_func调用了当前该代码所在的函数,跳回main_func
4. 比较以及比较之后的处理
CMP r1,r2//r1-r2但是不保存结果
BLS func_1//如果r1<=r2则执行func_1
CMP r1,r2
BLO func_2//r1<r2
CMP r1,r2
BCS func_3//r1>=r2
CMP r1,r2
BHI func_4//r1>r2
CMP r1,r2
bne func_5//r1!=r2,确切来说bne是判断CMP结果不为0
CMP r1,r2
beq func_6//r1==r2,同上,beq是判断CMP结果为0
5. 左移右移
LSR r1,r2//右移r2位
LSR r1,#1
LSL r1,r2
LSL r1,#1//左移1位
6. 逻辑运算
AND r1,r1,#1//r1和1进行逻辑与,结果存入r1
OR r1,r1,#3
EOR r1,r1,#3
7. 判断某位的值
其实也可以将5,6结合起来解决这个问题,不过TST确实很方便就是了
TST r0,#2//判断原数转为二进制后第二位是不是0,结果不保存
beq func1//是0,则跳转执行func1
8. 出栈入栈
之前说过存在一个栈区,可以暂时保存数字的值和程序状态,至于程序里为什么要写,因为这个函数中要用这些数值,主程序就不需要这些原来的数值了吗?但是注意到没有,其实我们一直在寄存器上修改,也就是说回到主程序后这个寄存器的值已不是原来的值,那别人怎么办!只能将不能改变的值放在栈区,用完再恢复覆盖掉。这就是高级语言函数隔离和局部变量的基本实现思路。
push {r0-r7,lr}//将r0到r7寄存器的值都入栈,函数调用状态也入栈
pop {r0-r7,pc}
二、书后练习答案
本人手写,不一定对,有错请务必指出
3.5.3
忘说了,str也挺重要的。str是将r0存入一个地址中。[label2]就是label2地址的值,[]可以理解为指针。
ldr r0,=label1
ldr r1,=label2
ldr r2,[r0]
str r2,[r1]
看了眼室友的,感觉是不是我写错了还是写麻烦了
.equ m1,label1
.equ m2,label2
ldr r0,=m1
ldr r1,=m2
str r0,[r1]
3.5.4
TST r1,#4
beq label1
5.5.5
二进制转十六进制,和十进制转十六进制一模一样。
data_format1:
.string "%d"
data_format2:
.string "%c"
main:
mov r2,#0b10101010
mov r3,#8
bl change_x
change_x:
push {r0-r7,lr}
loop:
mov r4,r2
sbc r3,r3,#4
lsr r4,r4,r3
and r4,#0b1111
cmp r4,#0b1010
bcs to_string
ldr r0,=data_format1
mov r1,r4
cmp r3,#0
bne loop
pop {r0-r7,pc}//就相当于b main(好像没这样写的),执行完毕回到主函数。
to_string:
mov r5,r4
adc r5,r5,#55
ldr r0,=data_format2
mov r1,r5
bl printf
b change_x
.end
十六进制转二进制
可以说非常简单了就是说,和十进制转二进制完全一样(严格来说r3的8应该是mov r3,#2和mul r3,r3,#4得到的,偷个懒),谁让这些数存进去都是二进制嘞。
.section .data
data_format:
.string "%d"
main:
mov r2,#0xAB
mov r3,#8
bl change_b
change_b:
push {r0-r7,lr}
loop:
mov r4,r2
sbc r3,r3,#1
lsr r4,r4,r3
and r1,r4,#1
ldr r0,=data_format
bl printf
cmp r4,#0
bne loop
pop {r0-r7,pc}