为什么编译器把C程序汇编成这个?
我不明白为什么C51编译器(在Keil中)会将C源代码转换成这种汇编语言代码:(因为p是指向无符号字符的指针) 由于为什么编译器把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取而代之。很可
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