瞌睡猪 发表于 2017-4-24 15:46:48

关于跳转指令和机器码的一些疑问

今天在群里面看到有人在讨论王爽老师的第九章的实验8(分析一个奇怪的程序)
所以自己就又去看了一遍
我的理解是:源程序生成的机器码中包涵了偏移的信息,不管这个机器码被搬到任何地方,只要执行这个机器码所对应的代码,所进行的偏移量都是不变的
问题:1.我的这种理解是不是正确的,如果有错,请帮忙指出,并希望能给出正确的结论
          2.所有包涵偏移意义的指令,比如JNE,JA等,是不是都是类似的(我认为都是类似的),如果不是,请指正
          3.还有没有其他的一些指令也具有跳转指令这样的性质?

请各位懂的指教,或者指条路,在什么地方可以搞清楚以上问题

谢谢!

Charles未晞 发表于 2017-4-24 15:46:49

我只学过51和arm9的汇编,所以只能给点意见。
首先,http://bbs.fishc.com/forum.php?mod=viewthread&tid=30183&typeid=2可以参考下评论~
其次,源程序生成的机器码中包涵了偏移的信息,不管这个机器码被搬到任何地方,只要执行这个机器码所对应的代码,所进行的偏移量都是不变的这句话看上去没错。不过如果cpu不同,偏移位数的限定,地址范围等等的约束是否要考虑?是否会产生不可预估的结果呢?所以我觉得只是值得商讨的问题。
另外,源程序生成的机器码在不同的cpu上都是有差别的,大多数是不可移植的。这里可以参考下这个百度回复https://zhidao.baidu.com/question/1175996873514670419.html。
最后,不是有这么一句话嘛,jmp指令执行时,cpu并不知道转移的目的地址。你可以百度下这句话帮助你理解jmp指令。

人造人 发表于 2017-4-24 17:13:12

本帖最后由 人造人 于 2017-4-24 17:15 编辑

assume cs:code


code segment
start:
        jmp e
        xor ax, ax
e:
        mov ax, 4c00h
        int 21h
code ends

end start


D:\Masm615>debug test.exe
-u
0BB3:0000 EB02          JMP   0004
0BB3:0002 33C0          XOR   AX,AX
0BB3:0004 B8004C      MOV   AX,4C00
0BB3:0007 CD21          INT   21
0BB3:0009 004CCD      ADD   ,CL
0BB3:000C 2121          AND   ,SP
0BB3:000E 2E            CS:
0BB3:000F A10A92      MOV   AX,
0BB3:0012 0AE4          OR      AH,AH
0BB3:0014 753D          JNZ   0053
0BB3:0016 8AE8          MOV   CH,AL
0BB3:0018 2E            CS:
0BB3:0019 8B160C92      MOV   DX,
0BB3:001D 83FB01      CMP   BX,+01
-


可以看到 jmp e 这条指令被翻译为 jmp 0004,也就是转移到地址 0BB3:0004


汇编语言只是机器语言的助记符,cpu不认识 jmp 0004 是什么
cpu认识 EB02
EB02 在这里就是 jmp 0004,jmp 0004 是 EB02 的助记符,你用masm可以直接写 jmp e,编译器在这个程序中帮你翻译成 EB02,如果你要用机器语言来写,可以,不过,如果我现在要转移到 MOV   AX,
那就需要一个字节一个字节的数偏移了^_^


在当前程序中
EB00 转移到 33
EB01 转移到 C0
EB02 转移到 B8

这正是 MOV   AX,4C00 的第一个字节
哦,不对,应该是第零个字节^_^

        jmp e
        xor ax, ax
e:
        mov ax, 4c00h

       
在接下来的学习中,你要记住,汇编语言真的只是机器语言的助记符,只有这样,你才能明白后面将会遇到的一些难题
       

yongtaige 发表于 2017-4-26 08:55:23

回答:1、正确
          2、正确
          3、完全正确

瞌睡猪 发表于 2017-4-28 21:44:57

人造人 发表于 2017-4-24 17:13
D:\Masm615>debug test.exe
-u
0BB3:0000 EB02          JMP   0004


感谢大神的耐心解答
如夜路明灯

瞌睡猪 发表于 2017-4-28 21:48:34

Charles未晞 发表于 2017-4-24 15:46
我只学过51和arm9的汇编,所以只能给点意见。
首先,http://bbs.fishc.com/forum.php?mod=viewthread&tid= ...

谢谢你的解答
你和“人造人”二位都对我的问题进行了详细的解答
不过他是大神,相必也不在乎这一个两个最佳答案了(我就这么想当然的以为着了,希望大神看到的时候不要隔着屏幕想揍我)
所以最佳就送给你了

Charles未晞 发表于 2017-4-29 00:03:39

瞌睡猪 发表于 2017-4-28 21:48
谢谢你的解答
你和“人造人”二位都对我的问题进行了详细的解答
不过他是大神,相必也不在乎这一个两个 ...

谢谢大佬{:7_146:}
页: [1]
查看完整版本: 关于跳转指令和机器码的一些疑问