栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

从汇编的角度看逻辑非

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

从汇编的角度看逻辑非

一、环境

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/718133.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号