无忧启动论坛

标题: 关于汇编语言跳转指令的疑问 [打印本页]

作者: pppfj    时间: 2019-2-20 23:48
标题: 关于汇编语言跳转指令的疑问
    因为关注wuoyou论坛,从而关注引导问题。因为关注引导,进而关注汇编。
    在汇编学习过程中,有一些基础问题的疑问,貌似简单,但作为学生,百思不得其解,故学习讨教。具体如下:

图1:请关注内存内容及CS:IP寄存器

图2:请关注内存地址FFF0内容(机器码)及相关地址寄存器

图3:请关注内存地址FFF0内容及DEBUG指令,以及DEBUG指令执行后CS:IP地址寄存器内容变化

疑问:
    1.在短跳转机器指令“EB 18”执行时(相当于汇编指令JMP short 18,向下跳转18H个内存地址),但指令所处位置处于IP寄存器(段内地址)尾端附近,如发生向前短跳转18H个地址情况,跳转范围并虽未超出规范对短跳转的要求(-128~127),但是,DEBUG的执行结果却迥然相反,不但没有向前跳转18H个地址,反而地址绕回到了CS段的起始位置附近(CS:000A),如何解释?
    2.在实际编程过程中,如果编程的程序汇编时,恰巧在段地址高位结束附近,出现一个短转移的跳转指令,且跳转范围超出本段,是否会造成跳转位置出错?该如何避免?
    之所以在这里提出这个问题,是因为感觉研究启动,离不了汇编,这里深刻研究和了解汇编的人多,望不吝赐教!
作者: zandrawoo    时间: 2019-2-21 09:47
本帖最后由 zandrawoo 于 2019-2-21 09:50 编辑

1.
机器码 EB 18 EB是短跳,18是距离(其值为正),意即由该指令之下的地址(FFF2)起加18H,
就利用DEBUG算一下吧

H FFF2 18
000A FFDA

000A是加的结果(忽略进位) FFFD是减的结果
所以变成汇编就是JMP 000A


2.
实际编程过程中,不太会出现楼主的困扰...
要IP处于高地址(正常编写,没有使用特殊技巧),
其程序必然十分巨大,编译后机器码长度接近或大于64K,
这时候编译会发现问题,发出警告:程式长度不能超过64K!或跳跃跨段!

作者: pppfj    时间: 2019-2-21 13:21
寥寥数语,茅塞顿开。谢谢!




欢迎光临 无忧启动论坛 (http://wuyou.net/) Powered by Discuz! X3.3