飘零星夜 发表于 2021-3-11 10:58

NEC(瑞萨)78K0R汇编实例分析

本帖最后由 飘零星夜 于 2021-3-11 11:01 编辑

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

1,ROM:12753sub_12753》》函数名称。

2,ROM:12753push HL》》将寄存器HL压栈,78kor有4个16位通用寄存器,分别是AX,BC,DE,HL.假设调用本函数时候SP = 0xFFE00。此时SP = 0xFFDFE 。特别的,HL通常是全局变量,进入函数之前要保存,退出函数时候要恢复原值。

3,ROM:12754push AX 》》压栈AX。通常情况下,程序要的是他的副总用,开辟2字节的栈空间。此时SP = 0xFFDFC了。

4,ROM:12755movw HL,!_SP 》》movw就是赋值,即 HL = SP .

5,ROM:12758movw AX,HL 》》 AX = HL = 0xFFDFC。

6,ROM:12759incw AX 》》 AX = AX +1.incw 就是自加1,decw是自减1.

7,ROM:1275Apush AX 》》 压栈 AX。78k0r函数只能接收一个参数AX,当有多个参数的时候,要将其他参数压栈传递。这里将栈地址0xFFDFD传递给子函数。

8,ROM:1275Bmovw AX,!word_FF2E2 》》 AX = 0xf2e2,78k0r的段地址固定等于0xf。实际上 AX指向 0xff2e2。//;send data 是自己添加的注释。

9,ROM:1275Eincw AX 》》 AX = 0xFF2E3。

10,ROM:1275Fcall !sub_13795 》》调用子函数13795 。有参数AX和压栈参数0Xffdfd.

11,ROM:12763pop AX。》》恢复传递参数时候占用的栈。

12,ROM:12764mov A, 》》将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:12766cmp0 A 》》A 与0进行比较。

14,ROM:12767bz loc_12772 》》等于0跳转到ROM:12772,反之跳转到ROM:12769。

15,ROM:12769movw DE,!word_FF2E4 》》DE = 0xff2e4。

16,ROM:1276Cmov A,【DE】》》将地址0xff2e4上的值赋给A。

17,ROM:1276Dadd A,【HL +0001h】。》》A加上0xffdfd上的值。

18,ROM:1276Fmov 【DE】,A 》》将更新后的A存回到0xff2e4上。

19,ROM:12772call loc_127e0 》》调用子函数 127e0 。这里的子函数怎么不是函数的默认开头sub ,而是语句块的头 loc ? 因为该函数被编译器优化了,把多个函数糅合在一起。通常这种情况下,都是库函数。不会是用户代码。可以不分析。

20,ROM:12776pop AX 》》对应第3步。恢复栈。注意,这里没有恢复AX.

21,ROM:12777pop HL 》》 恢复 HL.

22,ROM:12778   ret 》》函数返回 。就是return。   

meridian 发表于 2021-3-11 11:06

完全看不懂,但是我还要坚持看完

佚丶名 发表于 2021-3-11 11:14

看不懂,但是我还要坚持看完

飘零星夜 发表于 2021-3-11 11:18

meridian 发表于 2021-3-11 11:06
完全看不懂,但是我还要坚持看完

我写个伪C的截图传上来,这个和X86差不多的。

飘零星夜 发表于 2021-3-11 11:18

佚丶名 发表于 2021-3-11 11:14
看不懂,但是我还要坚持看完

凤毛麟角的大佬你好。就不要这样说了。

飘零星夜 发表于 2021-3-11 11:25




题外话:我不会写刷隐藏,真不会。

wwaaffll 发表于 2021-8-14 17:33

学习了谢谢分享

依行 发表于 2021-9-6 17:36

页: [1]
查看完整版本: NEC(瑞萨)78K0R汇编实例分析