【王宜怀微机原理】第三、四、五章指令押题汇总

本文介绍了汇编语言中的基本指令,包括跳转、加减法、函数调用、比较操作、移位、逻辑运算以及栈的使用。通过实例展示了如何理解和运用这些指令,还涉及到一些条件判断和数据存储。此外,文章还解答了书后的练习题,涵盖了字符串操作和数值转换。
摘要由CSDN通过智能技术生成

目录

 一、常见指令

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_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}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值