为什么编译器把C程序汇编成这个?
Why compiler assembly C program into this?
我不明白为什么 C51 编译器(在 Keil 中)将 C 源代码转换为以下汇编语言代码:(因为 p 是指向 unsigned char 的指针)
; 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 年代 "state of the art" 8 位目标处理器的代码生成。代码所做的是 p 在递增之前的 "noting the value" 。当在周围表达式中使用后增量运算符时,这是必需的;并没有被编译器的后续传递优化掉。
试试 p += 1;
,甚至 ++p;
。很可能其中一个或两个会生成更好的代码,因为没有 "note the value before" 语义来妨碍代码生成器。
[这就是我进入少数的方式,顺便说一下,在 for ()
循环中使用 ++i
而不是更常见的 i++
。]
我不明白为什么 C51 编译器(在 Keil 中)将 C 源代码转换为以下汇编语言代码:(因为 p 是指向 unsigned char 的指针)
; 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 年代 "state of the art" 8 位目标处理器的代码生成。代码所做的是 p 在递增之前的 "noting the value" 。当在周围表达式中使用后增量运算符时,这是必需的;并没有被编译器的后续传递优化掉。
试试 p += 1;
,甚至 ++p;
。很可能其中一个或两个会生成更好的代码,因为没有 "note the value before" 语义来妨碍代码生成器。
[这就是我进入少数的方式,顺便说一下,在 for ()
循环中使用 ++i
而不是更常见的 i++
。]