入住“博客园”

2019.11.15入住“博客园”开启了我的技术文章的开端

有没有人好奇KEIL 如何实现 汇编的

从最简单的单片机C 语言开始分析

#include<reg52.h>
void main()
{
unsigned char a=255;
unsigned char B=255;
unsigned char *p;

p=&a;
*p=254;

}

C中的内容简单 就是申请 内存 和申请内存的地址 并将它们赋值。

DBUG 一下分析一下()为我的分析

C:0x0000 020026 LJMP C:0026   (STEP15: 汇编的跳转指令 LJMP CPU无条件跳转到物理地址为16位:0026(16进制))
C?CSTPTR:
C:0x0003 BB0106 CJNE R3,#0x01,C:000C      (STEP 16:  CJNE :  R3:00 < 01 不相等 标志位C=1 并且 跳转到 000C   )
C:0x0006 8982 MOV DPL(0x82),R1
C:0x0008 8A83 MOV DPH(0x83),R2
C:0x000A F0 MOVX @DPTR,A
C:0x000B 22 RET
C:0x000C 5002 JNC C:0010 ()   (STEP17 判断  C :是否为0  不为0所以跳转到下一条)
C:0x000E F7 MOV @R1,A   (STEP18:A的内容  0X7F送到  R1: 0X08地址内 完成了对指针指向的地址赋值 )
C:0x000F 22 RET
C:0x0010 BBFE01 CJNE R3,#0xFE,C:0014
C:0x0013 F3 MOVX @R1,A
C:0x0014 22 RET
2: void main()
3: {
4: unsigned char a=255;
C:0x0015 7508FF MOV 0x08,#0xFF       (STEP8:开辟:0X 08 地址 并向内存储 0XFF)
5: unsigned char B=255;
6: unsigned char *p;
7:
C:0x0018 7509FF MOV 0x09,#0xFF     (STEP9: 开辟了 0X09的地址  并向内存储 0XFF :定义指针就是定义地址 )
8: p=&a;
C:0x001B 7B00 MOV R3,#0x00   (STEP10:寄存器相当于标记位)      
C:0x001D 7A00 MOV R2,#0x00   (STEP11:指针地址的临时存储位置:高8位)
C:0x001F 7908 MOV R1,#0x08    (STEP12:指针地址的临时存储位置:低8位)
9: *p=254;
C:0x0021 74FE MOV A,#0xFE     (STEP:13 :把要赋给指针指向的数值 ,先放到寄存器A中)
C:0x0023 020003 LJMP C?CSTPTR(C:0003)      (SETP14:跳转到 0003)
C:0x0026 787F MOV R0,#0x7F  ( STEP2 : 立即数:7F 放到寄存器 R0中 )
C:0x0028 E4 CLR A   (SETP 3 :寄存器A的内容 清零)
C:0x0029 F6 MOV @R0,A    (STEP4: 把A的内容存放到地址为7F 存储空间中)
C:0x002A D8FD DJNZ R0,C:0029     (STEP5:R0的数值7F减一 如果结果不为 0 就转移到 0029  直到 为0 跳转到 下一条)
C:0x002C 758109 MOV SP(0x81),#0x09   (STEP6: 以上延时后 将 堆栈SP 指向 0X09 )
C:0x002F 020015 LJMP main(C:0015)    (STEP7:跳转到 0015  进入MAIN 函数)
C:0x0032 00 NOP

猜你喜欢

转载自www.cnblogs.com/2SBC/p/11864246.html