进行编译之后会生成038Custm.M51文件,里面有局部变量,全局变量的地址;函数的地址,及函数变量的定义(有的lib会把变量去掉,此时你只能看到其绝对地址,这时你应该区别它是全局的绝对地址,还是局部变量)
下面的编译信息即为封装库里的函数信息.
------- PROC _PHYWRITEPAGEFROMSRAM
X:947DH SYMBOL bStorPath ===传递的参数
X:947EH SYMBOL bLen
------- DO
D:0055H SYMBOL bb ====局部变量的定义
D:0056H SYMBOL fRet
D:0057H SYMBOL bKeepSpeed
D:0058H SYMBOL bAdjust
------- ENDDO
C:BD3DH LINE# 7843
………..
C:BE93H LINE# 7995
C:BE94H LINE# 7998
------- ENDPROC _PHYWRITEPAGEFROMSRAM
可以看出其大体的框架为:
PHYWRITEPAGEFROMSRAM(XBYTE bStorPath,XBYTE bLen )
{
BYTE bb, fRet, bKeepSpeed, bAdjust
}
2.反汇编代码的获取:
首先编译工程,
点击”start/stop debug session”按钮
点击”disassembly window”
此时你可以将所有的的汇编程序coy到专业的文本编辑框,保存.我所用的是UltraEdit-32,且把文件后缀改为.c;有时进行反汇译时,你可能对一些函数弄不明白,特别是case语句,此时你可以修改右侧的regester及pc ptr.对于case语句的跳转,你可以把switch(cmd),试着把cmd的值输入到r7,把switch的输入地址填入pc $.按F11单步运行就可以了.
您可以点击”Memory window”来查看二进制代码,及xdata,idata变量空间
如果你需要查看xdata 地址为1的变量输入x:0x0001即可
3.汇编语言的模块程序归类
1)
DWORD TMP,TMP1
IF(TMP==TMP1)
{
}
汇编程序:
R4R5R6R7 = TMP1;
R0R1R2R3 = TMP;
CLR C
C?ULCMP
JNZ Continue_Proc
{
}
Continue_Proc:
2)
DWORD TMP,TMP1;
IF(TMP> TMP1)
{
}
汇编程序:
R4R5R6R7 = TMP1;
R0R1R2R3 = TMP;
SETB C
C?ULCMP
JC Continue_Proc
{
}
Continue_Proc:
3)
DWORD TMP,TMP1;
IF(TMP> =TMP1)
{
}
汇编程序:
R4R5R6R7 = TMP1;
R0R1R2R3 = TMP;
CLR C
C:ULCMP
JC Continue_Proc
{
}
Continue_Proc:
4)
DWORD TMP,TMP1;
IF(TMP <TMP1)
{
}
汇编:
R4R5R6R7 = TMP1;
R0R1R2R3 = TMP;
CLR C
C:ULCMP
JNC Continue_Proc
{
}
Continue_Proc:
5)
DWORD TMP,TMP1;
IF(TMP <=TMP1)
{
}
汇编语言:
R4R5R6R7 = TMP1;
R0R1R2R3 = TMP;
SETB C
C:ULCMP
JNC Continue_Proc
{
}
Continue_Proc:
6)
DWORD TMP,TMP1;
TMP/TMP1;
汇编:
R4R5R6R7 = TMP1;
R0R1R2R3 = TMP;
C?ULDIV
其中,商放到:R4R5R6R7;余数放在:R0R1R2R3
WORD TMP,TMP1;
TMP/TMP1
汇编:
R6R7 = TMP;
R4R5 = TMP1;
运算的结果商:R6R7,余数:R4R5
7)
DWORD TMP,TMP1;
TMP*TMP1;
调用C?LMULP 积放到:R4R5R6R7
8)
DWORD(XDWORD) TMP1;
BYTE(XBYTE) BI;
TMP1> > BI
汇编语言:
R4R5R6R7 = TMP;
R0 = BI;
C?ULSHR ,
结果放在:R4R5R6R7
由于此文档有一些图片,无法链接,我把此份文档上传至
““,“sokutek.com/document.asp“,