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条)