鱼C论坛

 找回密码
 立即注册
查看: 2894|回复: 6

[已解决]关于跳转指令和机器码的一些疑问

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

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

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

最佳答案

查看完整内容

我只学过51和arm9的汇编,所以只能给点意见。 首先,http://bbs.fishc.com/forum.php?mod=viewthread&tid=30183&typeid=2可以参考下评论~ 其次,源程序生成的机器码中包涵了偏移的信息,不管这个机器码被搬到任何地方,只要执行这个机器码所对应的代码,所进行的偏移量都是不变的这句话看上去没错。不过如果cpu不同,偏移位数的限定,地址范围等等的约束是否要考虑?是否会产生不可预估的结果呢?所以我觉得只是值得商讨的问题。 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

使用道具 举报

发表于 2017-4-24 17:13:12 | 显示全部楼层
本帖最后由 人造人 于 2017-4-24 17:15 编辑
  1. assume cs:code


  2. code segment
  3. start:
  4.         jmp e
  5.         xor ax, ax
  6. e:
  7.         mov ax, 4c00h
  8.         int 21h
  9. code ends

  10. 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     [SI-33],CL
0BB3:000C 2121          AND     [BX+DI],SP
0BB3:000E 2E            CS:
0BB3:000F A10A92        MOV     AX,[920A]
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,[920C]
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,[920A]
那就需要一个字节一个字节的数偏移了^_^


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

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

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

       
在接下来的学习中,你要记住,汇编语言真的只是机器语言的助记符,只有这样,你才能明白后面将会遇到的一些难题
       
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-4-26 08:55:23 | 显示全部楼层
回答:1、正确
          2、正确
          3、完全正确
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-4-28 21:44:57 | 显示全部楼层
人造人 发表于 2017-4-24 17:13
D:\Masm615>debug test.exe
-u
0BB3:0000 EB02          JMP     0004

感谢大神的耐心解答
如夜路明灯
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

谢谢你的解答
你和“人造人”二位都对我的问题进行了详细的解答
不过他是大神,相必也不在乎这一个两个最佳答案了(我就这么想当然的以为着了,希望大神看到的时候不要隔着屏幕想揍我)
所以最佳就送给你了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

谢谢大佬
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-27 06:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表