汇编语言中的机器码跨指令复用现象一瞥

今天头一次反汇编,语言是8051汇编。hex文件是给CT107D开发板用的,功能是播放《八月桂花遍地开》。

因为我手头那块板子捐掉了,所以也没什么办法体会这个是怎么实现的。于是想起了反汇编这么回事……

工具主要用了两样,一样是D52 Disassembler,另一样是Keil uVision调试工具中的反汇编能力。

结果反汇编出来的汇编源程序,有的跳转指令跳转到的地方看起来并不是一个正常的标号,看得我一愣一愣的。比如这个:

                     ; 地址      机器码
ljmp    X017f        ; 0141     02 01 7f

问题是X017f这个标号只是简单的被替换成了017FH这个地址(X017f equ 017fh)而已。问题来了,017F在哪?相应的机器码是什么?

找了半天找出来了

    sjmp    X0110        ; 017e   80 90      ..
;
    org    181h
;
    rr    a        ; 0181   03

或许这段话全部翻译成机器码更容易看一些:

地址    ...    017e    017f    0180    0181  ...
机器码  ...     80      90      00      03

其中0180h处的机器码是借助Keil的反汇编得知的。

好了,下面就是疯狂地查手册——机器码对应的指令是什么?

查到机器码90h对应MOV DTPR, #data16。这下可好,90h后面跟的两个字节都是这个指令的操作数。

也就是说,LJMP X017f实际上跳转到了这个指令

mov dptr #0003

搞了半天可算搞明白了。回头想想编译器居然有这种操作——编出机器码跨指令复用的玩意,真是太可怕了。(也许以后破解单片机的时候就不可怕了(逃

发表评论

电子邮件地址不会被公开。