首页
论坛
课程
招聘
[原创]NEC(瑞萨)78K0R汇编实例分析
2021-3-22 20:15 5689

[原创]NEC(瑞萨)78K0R汇编实例分析

2021-3-22 20:15
5689

78k0r原属于NEC的16位架构(现在属于瑞萨),主要用于汽车防盗等领域。这里举例简单介绍一下。
首先,当然是用IDA反汇编一下bin文件。得到一个如图的界面。接下来按顺序介绍图中各条语句。

1,ROM:12753 sub_12753 》》函数名称。
2,ROM:12753 push HL》》将寄存器HL压栈,78kor有4个16位通用寄存器,分别是AX,BC,DE,HL.假设调用本函数时候SP = 0xFFE00。此时SP = 0xFFDFE 。特别的,HL通常是全局变量,进入函数之前要保存,退出函数时候要恢复原值。
3,ROM:12754 push AX 》》压栈AX。通常情况下,程序要的是他的副总用,开辟2字节的栈空间。此时SP = 0xFFDFC了。
4,ROM:12755 movw HL,!_SP 》》movw就是赋值,即 HL = SP .
5,ROM:12758 movw AX,HL 》》 AX = HL = 0xFFDFC。
6,ROM:12759 incw AX 》》 AX = AX +1.incw 就是自加1,decw是自减1.
7,ROM:1275A push AX 》》 压栈 AX。78k0r函数只能接收一个参数AX,当有多个参数的时候,要将其他参数压栈传递。这里将栈地址0xFFDFD传递给子函数。
8,ROM:1275B movw AX,!word_FF2E2 》》 AX = 0xf2e2,78k0r的段地址固定等于0xf。实际上 AX指向 0xff2e2。//;send data 是自己添加的注释。
9,ROM:1275E incw AX 》》 AX = 0xFF2E3。
10,ROM:1275F call !sub_13795 》》调用子函数13795 。有参数AX和压栈参数0Xffdfd.
11,ROM:12763 pop AX。》》恢复传递参数时候占用的栈。
12,ROM:12764 mov A,[HL +0001h] 》》将0xFFDFD上的值赋给A 。子函数sub_13795的计算结果。78k0r的4个16位通用寄存器可以拆分为8个8位的通用寄存器:X,A,C,B,E,D,L,H.例如AX = 0x1234 等价于 A = 0x12,X=0x34。
13,ROM:12766 cmp0 A 》》A 与0进行比较。
14,ROM:12767 bz loc_12772 》》等于0跳转到ROM:12772,反之跳转到ROM:12769。
15,ROM:12769 movw DE,!word_FF2E4 》》DE = 0xff2e4。
16,ROM:1276C mov A,【DE】》》将地址0xff2e4上的值赋给A。
17,ROM:1276D add A,【HL +0001h】。》》A加上0xffdfd上的值。
18,ROM:1276F mov 【DE】,A 》》将更新后的A存回到0xff2e4上。
19,ROM:12772 call loc_127e0 》》调用子函数 127e0 。这里的子函数怎么不是函数的默认开头sub ,而是语句块的头 loc ? 因为该函数被编译器优化了,把多个函数糅合在一起。通常这种情况下,都是库函数。不会是用户代码。可以不分析。
20,ROM:12776 pop AX 》》对应第3步。恢复栈。注意,这里没有恢复AX.
21,ROM:12777 pop HL 》》 恢复 HL.
22,ROM:12778 ret 》》函数返回 。就是return。


2021 KCTF 秋季赛 防守篇-征题倒计时(11月14日截止)!

收藏
点赞0
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回