- 积分
- 90
- 实力分
- 点
- 金钱数
- 两
- 技术分
- 分
- 贡献分
- 分
|
发表于 2006-2-12 14:32:40
|
显示全部楼层
看狼大的例程
$Segmented
$Mod167
Patch_Address EQU 1F8000h ;Free Space in Flash (CHANGE THIS)
Patch Section Code Word At Patch_address ; Start Patch at Patch_Address
main proc far ; start main of patch
;TODO,恢复跳转指令覆盖的语句
mov [-r0],r12
mov [-r0],r13
mov [-r0],r14
mov [-r0],r15
mov r4,#8 ;调用栈深度
cmp r12, #4E3h ;以下为判断察看条件,比如调用字符4E3的时候,需自行修改
jmp CC_NZ, ProcEnd
mov r15, r4
mov r14, #1000h ;调用栈的输出开始地址,我一般会用0C:1000
PopProc:
pop r12
pop r13
extp #0Ch, #1
mov [r14],r12 ;存储调用栈的Offset
add r14,#2
extp #0Ch, #1
mov [r14],r13 ;存储调用栈的Seg
add r14,#2
mov [-r0],r12 ;将系统栈的内容压入用户栈保存
mov [-r0],r13
sub r15,#1
jmp CC_NZ,PopProc ;判断深度
mov r15,r4 ;恢复系统栈
PushProc:
mov r13,[r0+]
mov r12,[r0+]
push r13
push r12
sub r15,#1
jmp CC_NZ,PushProc
ProcEnd:
mov r15,[r0+]
mov r14,[r0+]
mov r13,[r0+]
mov r12,[r0+]
rets
main endp
Patch EndS
END
这个例程可以把一定深度的调用栈显示在c:1000的位置,然后用AT指令可以看到函数的调用点的下一个位置,因为调用函数是会把下一条指令的位置压入系统栈。
还有我常用的dump 积存器
org 0BF36C0h
extp #37h, #4
mov 3FB0h, r1
mov 3FB2h, r2
mov 3FB4h, r3
mov 3FB6h, r4
extp #37h, #4
mov 3FB8h, r5
mov 3FBAh, r6
mov 3FBCh, r7
mov 3FBEh, r8
mov 3FC0h, r9
extp #37h, #4
mov 3FC2h, r10
mov 3FC4h, r11
mov 3FC6h, r12
mov 3FC8H, r13
extp #37h, #2
mov 3FCAh, r14
mov 3FCCh, r15
一定记得的是要补原指令 |
|