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 (STEP1: 汇编的跳转指令 LJMP CPU无条件跳转到物理地址为16位:0026(16进制))
C?CSTPTR:
C:0x0003 BB0106 CJNE R3,#0x01,C:000C (STEP 15: 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 () (STEP16 判断 C :是否为0 不为0所以跳转到下一条)
C:0x000E F7 MOV @R1,A (STEP17: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