从汇编的角度看逻辑非

一、环境

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就可以按位取反得到。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值