本帖最后由 叶春勇 于 2021-9-28 11:09 编辑
最近机缘巧合复习了一下51单片机的反汇编,查了个参数。
在PC机上的反汇编有很多学习资料,但是嵌入式的好少。以下是我根据PC机的反汇编套路,对keil c51的程序结构进行分析。
首先是程序定式:
一、单分支
C代码
- C语言单分支
- if(cond)
- {
- do_something();
- }
keil c51汇编器的定式:
- 单分支定式:
- IF_BEGIN:
- JXX IF_END
- ...
- IF_END:
论述:
1、jxx代表条件跳转
2、c的条件,满足则执行。汇编的条件,满足则跳走,不满足则执行。所以c语言的条件与汇编相反。
3、jxx 往“下”跳,即往高地址跳。与下面所述的循环定式往“上”跳,相反。
二、双分支
c代码:
- if(cond)
- {
- do_something_1();
- }
- else
- {
- do_something_2();
- }
keil c51汇编器的定式:
- IF_BEGIN:
- JXX ELSE_BEGIN
- ...
- IF_END:
- XJMP ELSE_END
- ELSE_BEGIN:
- ...
- ELSE_END:
论述:
1、相比单分支,有一个xJMP,通常是sjmp
2、与C语言条件相反。
三、do_while循环
c语言代码
- do
- {
- do_something();
- } while(cond);
keil c51 汇编定式:
- DO_BEGIN:
- ...
- JXX DO_BEGIN
论述:
1、循环往“上”跳,即往低地址跳。鉴别条件分支结构和循环结构的关键
2、按PC机的汇编器的优化,编译器喜欢把while和for循环往do while循环优化。
四、while循环
C语言:
- while(cond)
- {
- do_something();
- }
keil c51汇编器定式:
- WHILE_BEGIN:
- ...
- JXX WHILE_END
- BODY:
- ...
- XJMP WHILE_BEGIN
- WHILE_END:
论述:
1、相比do while循环多了一个xjmp,通常是sjmp指令。
2、往上跳
五:for循环
C语言:
- for(INIT,COND,STEP)
- {
- do_something();
- }
keil c51 汇编定式:
- FOR_INIT:
- ...
- FOR_COND:
- ...
- JXX WHILE_END
- BODY:
- ...
- FOR_STEP:
- ...
- XJMP FOR_COND
- WHILE_END:
论述:
1、为了让人用着舒服,汇编代码复杂多了。
2、for循环,是if+dowhile循环的混合体。
五、switch case 机构
参考代码,特征明显
- LAB_CODE_0094 XREF[1]: CODE:00c9(j)
- CODE:0094 e5 08 MOV A,BANK1_R0 = ??
- CODE:0096 14 DEC A
- CODE:0097 60 12 JZ LAB_CODE_00ab
- CODE:0099 14 DEC A
- CODE:009a 60 14 JZ LAB_CODE_00b0
- CODE:009c 14 DEC A
- CODE:009d 60 16 JZ LAB_CODE_00b5
- CODE:009f 14 DEC A
- CODE:00a0 60 18 JZ LAB_CODE_00ba
- CODE:00a2 24 04 ADD A,#0x4
- CODE:00a4 70 19 JNZ LAB_CODE_00bf
- CODE:00a6 75 09 0a MOV BANK1_R1,#0xa = ??
- CODE:00a9 80 17 SJMP LAB_CODE_00c2
- LAB_CODE_00ab XREF[1]: CODE:0097(j)
- CODE:00ab 75 09 01 MOV BANK1_R1,#0x1 = ??
- CODE:00ae 80 12 SJMP LAB_CODE_00c2
- LAB_CODE_00b0 XREF[1]: CODE:009a(j)
- CODE:00b0 75 09 21 MOV BANK1_R1,#0x21 = ??
- CODE:00b3 80 0d SJMP LAB_CODE_00c2
- LAB_CODE_00b5 XREF[1]: CODE:009d(j)
- CODE:00b5 75 09 0b MOV BANK1_R1,#0xb = ??
- CODE:00b8 80 08 SJMP LAB_CODE_00c2
- LAB_CODE_00ba XREF[1]: CODE:00a0(j)
- CODE:00ba 75 09 16 MOV BANK1_R1,#0x16 = ??
- CODE:00bd 80 03 SJMP LAB_CODE_00c2
- LAB_CODE_00bf XREF[1]: CODE:00a4(j)
- CODE:00bf e4 CLR A
- CODE:00c0 f5 09 MOV BANK1_R1,A = ??
- LAB_CODE_00c2 XREF[5]: CODE:00a9(j), CODE:00ae(j),
- CODE:00b3(j), CODE:00b8(j),
- CODE:00bd(j)
- CODE:00c2 05 08 INC BANK1_R0 = ??
- CODE:00c4 53 08 03 ANL BANK1_R0,#0x3 = ??
- CODE:00c7 05 09 INC BANK1_R1 = ??
- CODE:00c9 80 c9 SJMP LAB_CODE_0094
多个条件跳转,规则且对齐的往下跳,且与某个变量有关。
|