为什么编译器把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

因为 R3R2 没有在程序的下一行中使用。
为什么编译器会生成这些行
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++。]