ASM(X)部分指令

概述

为了分析CMSIS源码

指令

  1. MRS指令
    MRS{<cond>}<Rd>, CPSR
    
    MRS{<cond>}<Rd>, SPSR
    
  2. 示例函数
    __ASM uint32_t __get_PSP(void) // 返回堆栈指针(ProcessStackPointer)
    {
      mrs r0, psp
      bx lr
    }
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
```c #include <stdio.h> #include "do_loop.c" int main() { short x, y, k; printf("Please enter x, y, k:\n"); scanf("%hd %hd %hd", &x, &y, &k); short result = do_loop(x, y, k); printf("Result is %hd\n", result); return 0; } ``` 使用命令行编译: ``` gcc -O1 -g do_loop.c main.c -o main ``` 运行程序: ``` ./main Please enter x, y, k: 2 4000 3 Result is 0 ``` 进入gdb调试模式,设置断点: ``` gdb main (gdb) break do_loop (gdb) run Please enter x, y, k: 2 4000 3 Breakpoint 1, do_loop (x=2, y=4000, k=3) at do_loop.c:2 2 do { ``` 进入TUI模式,显示汇编代码和寄存器: ``` (gdb) layout asm (gdb) layout regs ``` 单步执行,查看寄存器变化: ``` (gdb) si 0x00005555555551a8 in do_loop (x=2, y=4000, k=3) at do_loop.c:2 2 do { (gdb) print $edx $1 = 0x0 (gdb) si 0x00005555555551b5 in do_loop (x=2, y=4000, k=3) at do_loop.c:3 3 x*=(y%k) ; k--; (gdb) print $edx $2 = 0x0 (gdb) si 0x00005555555551c2 in do_loop (x=2, y=4000, k=3) at do_loop.c:4 4 } while ((k>0) && (y>k)); (gdb) print $edx $3 = 0x0 (gdb) si 0x00005555555551d2 in do_loop (x=0, y=4000, k=-1) at do_loop.c:5 5 return x; (gdb) print $edx $4 = 0x0 ``` 回答问题: 1. a) %edx 的值为 0。 b) 执行完 cltd 指令后,%edx 的值变成了 0xFFFF,即-1的补码。 c) cltd 指令的作用是将%eax中的有符号数符号扩展到%edx中,对于正数,%edx中的所有位被清零,对于负数,%edx中的所有位被置为1。 d) 执行%idiv指令后,除法的商存储在%eax中,余数存储在%edx中。由于在本题中,%eax 中的值一直为0,所以执行%idiv指令后,%edx中的值不变,仍为0。 2. 执行与第一部分相同的步骤,得到的结果为: a) %edx 的值为 0。 b) 执行完 cltd 指令后,%edx 的值变成了 0xFFFF,即-1的补码。 c) cltd 指令的作用是将%eax中的有符号数符号扩展到%edx中,对于正数,%edx中的所有位被清零,对于负数,%edx中的所有位被置为1。 d) 执行%idiv指令后,除法的商存储在%eax中,余数存储在%edx中。由于在本题中,%eax 中的值一直为0,所以执行%idiv指令后,%edx中的值不变,仍为0。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值