首次接触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。
代码如下:
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