从汇编的角度看逻辑非

从汇编的角度看逻辑非,第1张

汇编的角度看逻辑非 一、环境

stm32f429,keil,编译器版本V5.06,优化等级-O0

二、代码
...
uint16_t x = 0;  //全局变量
...
x = !x;
...
0x0800048E  LDR           r0,[pc,#16]  ; @0x080004A0
0x08000490  LDRH          r1,[r0,#0x00]
0x08000492  CBNZ          r1,0x080004A2
0x08000494  MOVS          r1,#0x01
0x08000496  STRH          r1,[r0,#0x00]

......
0x080004A2  MOVS          r1,#0x00
0x080004A4  B             0x08000496

第一行:将全局x所在的地址加载到寄存器R0

第二行:将R0所指向的内存加载半字到R1,LDRH加了个H代表只加载半字,因为定义的全局变量也是16位的

第三行:检查R0是否为0,不是0就跳转到0x080004A2这里,否则继续往下执行

第四行:将R1的内容赋值半字到R0所指的内存中,最后一行也会跳到这一行来,用来将变量的值保存到栈区。

结论:整个逻辑非的 *** 作用汇编来实现并不像只用一个符号(!)那样简单。非零为0、零为1事实上是通过立即数0和1加上条件分支来实现的,有些类似于C语言的if else。逻辑取反(~)就会好很多,只需要一条指令mvn就可以按位取反得到。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5714452.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存