【王宜怀微机原理】第三、四、五章指令押题汇总
目录
一、常见指令
1. 跳转:
2. 加减(乘没遇到过,反正是一样的)
3. 函数跳转
4. 比较以及比较之后的处理
5. 左移右移
6. 逻辑运算
7. 判断某位的值
8. 出栈入栈
二、书后练习答案
3.5.3
3.5.4
5.5.5
一、常见指令
直接给例子,应该比较好理解(我怎么一会大写一会小写的。。。),掌握这些读程序就不成问题了,写程序就是熟练度的问题,多练,多自己想。
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_1CMP r1,r2
BLO func_2//r1<r2CMP r1,r2
BCS func_3//r1>=r2CMP r1,r2
BHI func_4//r1>r2CMP r1,r2
bne func_5//r1!=r2,确切来说bne是判断CMP结果不为0CMP r1,r2
beq func_6//r1==r2,同上,beq是判断CMP结果为0
5. 左移右移
LSR r1,r2//右移r2位LSR r1,#1LSL r1,r2LSL 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,#0b10101010mov r3,#8bl change_xchange_x:push {r0-r7,lr}loop:mov r4,r2sbc r3,r3,#4lsr r4,r4,r3and r4,#0b1111cmp r4,#0b1010bcs to_stringldr r0,=data_format1mov r1,r4cmp r3,#0bne looppop {r0-r7,pc}//就相当于b main(好像没这样写的),执行完毕回到主函数。to_string:mov r5,r4adc r5,r5,#55ldr r0,=data_format2mov r1,r5bl printfb change_x.end
十六进制转二进制
可以说非常简单了就是说,和十进制转二进制完全一样(严格来说r3的8应该是mov r3,#2和mul r3,r3,#4得到的,偷个懒),谁让这些数存进去都是二进制嘞。
.section .data
data_format:.string "%d"main:mov r2,#0xABmov r3,#8bl change_bchange_b:push {r0-r7,lr}loop:mov r4,r2sbc r3,r3,#1lsr r4,r4,r3and r1,r4,#1ldr r0,=data_formatbl printfcmp r4,#0bne looppop {r0-r7,pc}