c - 为什么编译汇编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
?
解决方案
欢迎来到 1980 年代 8 位目标处理器的“最先进”代码生成。代码所做的是在增加 p 之前“注意值”。当在周围的表达式中使用后增量运算符时,这是必要的;并且不会被编译器的后续传递优化掉。
尝试p += 1;
,甚至++p;
代替。很可能其中之一或两者都会生成更好的代码,因为没有“注意之前的值”语义会妨碍代码生成器。
[顺便说一句,这就是我进入少数派的方式,使用++i
infor ()
循环而不是更常见的i++
.]
推荐阅读
- node.js - 我需要尝试...捕获请求吗?
- spring-boot - 如何在多战 Tomcat 上共享 Hazelcast 缓存
- c++ - SFINAE 的不同 g++ 和 clang 行为
- php - 更新但不从文件夹中删除图像我也在单独的文件中尝试过但不起作用
- javascript - 使用PhoneGap Build,它说'google-services.json is missing',但事实并非如此
- python - 如何在 Windows 上使用 python 更新 Chrome 浏览器?
- java - 如何将数组列表说明为序列图?
- javascript - 最大宽度检测/功能的最佳语法 JavaScript
- python - 如何将文件路径正确传递到 argparser 以进行 tesseract?
- azure - Azure:如何确保 Runbook 每台服务器仅调用一次