我不明白为什么C51编译器(在Keil中)将C源代码转换为以下汇编语言代码:(因为p是指向无符号字符的指针)
; p++;
; SOURCE LINE # 216
MOV R3,pDisplay?253
INC pDisplay?253+02H
MOV A,pDisplay?253+02H
MOV R2,pDisplay?253+01H
JNZ ?C0090
INC pDisplay?253+01H
由于在程序的下一行中未使用
R3
和R2
。为什么编译器将这些行设置为
MOV R3,pDisplay?253
和MOV R2,pDisplay?253+01H
? 最佳答案
欢迎使用1980年代8位目标处理器的“最新技术”代码生成。代码正在做的是在递增p之前“注意到p的值”。在周围的表达式中使用postincrement运算符时,这是必需的;并且没有被编译器的后续遍历优化。
尝试p += 1;
,甚至尝试++p;
。可能其中之一或两者都会生成更好的代码,因为没有“注意之前的值”语义会妨碍代码生成器的方式。
[顺便说一下,这就是我进入少数派的方式,在++i
循环中使用for ()
而不是更常见的i++
。]
关于c - 为什么编译器将C程序汇编成这个?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51048926/