为什么编译器把C程序汇编成这个?

为什么编译器把C程序汇编成这个?,c,pointers,assembly,keil,8051,C,Pointers,Assembly,Keil,8051,我不明白为什么C51编译器(在Keil中)会将C源代码转换成这种汇编语言代码:(因为p是指向无符号字符的指针) 由于R3和R2未在程序的下一行中使用 为什么编译器要让这些行movr3,pDisplay?253,movr2,pDisplay?253+01H 欢迎来到20世纪80年代针对8位目标处理器的“最先进”代码生成。代码所做的是在递增p之前“注意p的值”。当在周围表达式中使用postincrement运算符时,这是必需的;并且不会被编译器的后续过程优化掉 尝试p+=1,甚至++p取而代之。很可

我不明白为什么C51编译器(在Keil中)会将C源代码转换成这种汇编语言代码:(因为p是指向无符号字符的指针)

由于
R3
R2
未在程序的下一行中使用
为什么编译器要让这些行
movr3,pDisplay?253

movr2,pDisplay?253+01H

欢迎来到20世纪80年代针对8位目标处理器的“最先进”代码生成。代码所做的是在递增p之前“注意p的值”。当在周围表达式中使用postincrement运算符时,这是必需的;并且不会被编译器的后续过程优化掉

尝试
p+=1
,甚至
++p取而代之。很可能其中一个或两个会生成更好的代码,因为没有“在代码生成器的方式之前注意值”语义


[这就是我成为少数人的原因,顺便说一句,在
for()
循环中使用
++I
,而不是更常见的
I++

启用优化了吗?优化默认设置为8级。请显示完整的C函数和该函数的完整程序集转储。程序集转储中的“此程序集对应于此C源代码”注释经常出错。我知道了。我尝试了像
p0=p++
并发现Keil使用库中的函数
?C?CLDPTR
将R1/R2/R3数据加载到a,最后将a传递给p0。
谢谢。@Gamcheong这是一个“注意以前的值”很重要的示例。相当于
p0=p1,p1+=1并且任何编译器都没有理由用更长的显式版本生成更好的代码。如果周期或代码字节很重要,请避免使用
p1++
进行增量运算,而不使用先前的
p1
值。
;   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