微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 首次接触C51之—HelloWorld反汇编代码解析

首次接触C51之—HelloWorld反汇编代码解析

时间:10-02 整理:3721RD 点击:
今天下午在论坛下了一个C51单片机教程,第一个接触到的就是Keil C51环境下如何点亮一个LED灯。
代码如下:
HelloWorld Project
#include <reg52.h>
sbit Hello=P1^0;                    //;这句我理解:P1=90H 然后和0异或 将结果赋给sbit类型变量Hello
void main()
{
        Hello=0;                        //;这句我理解:将Hello赋值为0
}
上面注解是我的理解,但我看到半天硬是没看懂。书上不是说要将P1的最低位设为0才能达到点亮一个LED灯的效果吗?
但我看了半天都没有将P1.0设为0的代码。郁闷。
后来将HelloWorld Project 生成HEX文件然后放到反汇编器里直接看反汇编代码,代码如下:
Q0000:  LJMP  Q0003                          跳转到Q0003处
Q0003:  MOV   R0,#7FH                      将7FH放到R0寄存器
             CLR   A                                   累加寄存器A清0
Q0006:  MOV   @R0,A                         将0放入[7FH]地址中
             DJNZ  R0,Q0006                    R0减1并跳到Q0006处执行(这句和上句就是将0-7FH地址全部清0)
             MOV   SP,#07H                      设置堆栈
             LJMP  Q000F                          跳到 Q000F处
Q000F:   CLR   P1.0                            P1.0清0
看到反汇编代码我才搞明白,原来是这样一个流程,不知道有木有和我一样对C代码感到困惑的同学,这下应该可以看明白了。
PS:有木有朋友告诉下我sbit 类型到底是个什么类型?reg52.h 头文件中没看到定义,不知道在那个文件中。
有知道的朋友告诉下,3Q。

其实,还不是很明白

搞不懂为什么要清零0-7f

懂了,貌似是清空低128ram

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top