关于跳转指令和机器码的一些疑问
今天在群里面看到有人在讨论王爽老师的第九章的实验8(分析一个奇怪的程序)所以自己就又去看了一遍
我的理解是:源程序生成的机器码中包涵了偏移的信息,不管这个机器码被搬到任何地方,只要执行这个机器码所对应的代码,所进行的偏移量都是不变的
问题:1.我的这种理解是不是正确的,如果有错,请帮忙指出,并希望能给出正确的结论
2.所有包涵偏移意义的指令,比如JNE,JA等,是不是都是类似的(我认为都是类似的),如果不是,请指正
3.还有没有其他的一些指令也具有跳转指令这样的性质?
请各位懂的指教,或者指条路,在什么地方可以搞清楚以上问题
谢谢! 我只学过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: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
在接下来的学习中,你要记住,汇编语言真的只是机器语言的助记符,只有这样,你才能明白后面将会遇到的一些难题
回答:1、正确
2、正确
3、完全正确 人造人 发表于 2017-4-24 17:13
D:\Masm615>debug test.exe
-u
0BB3:0000 EB02 JMP 0004
感谢大神的耐心解答
如夜路明灯 Charles未晞 发表于 2017-4-24 15:46
我只学过51和arm9的汇编,所以只能给点意见。
首先,http://bbs.fishc.com/forum.php?mod=viewthread&tid= ...
谢谢你的解答
你和“人造人”二位都对我的问题进行了详细的解答
不过他是大神,相必也不在乎这一个两个最佳答案了(我就这么想当然的以为着了,希望大神看到的时候不要隔着屏幕想揍我)
所以最佳就送给你了 瞌睡猪 发表于 2017-4-28 21:48
谢谢你的解答
你和“人造人”二位都对我的问题进行了详细的解答
不过他是大神,相必也不在乎这一个两个 ...
谢谢大佬{:7_146:}
页:
[1]