本帖最后由 叶春勇 于 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
多个条件跳转,规则且对齐的往下跳,且与某个变量有关。
|