首页 > 解决方案 > 为什么编译汇编C程序成这个?

问题描述

我不明白为什么 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

标签: cpointersassemblykeil8051

解决方案


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

尝试p += 1;,甚至++p;代替。很可能其中之一或两者都会生成更好的代码,因为没有“注意之前的值”语义会妨碍代码生成器。

[顺便说一句,这就是我进入少数派的方式,使用++iinfor ()循环而不是更常见的i++.]


推荐阅读