无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 3533|回复: 2
打印 上一主题 下一主题

关于汇编语言跳转指令的疑问

[复制链接]
跳转到指定楼层
1#
发表于 2019-2-20 23:48:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    因为关注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.在实际编程过程中,如果编程的程序汇编时,恰巧在段地址高位结束附近,出现一个短转移的跳转指令,且跳转范围超出本段,是否会造成跳转位置出错?该如何避免?
    之所以在这里提出这个问题,是因为感觉研究启动,离不了汇编,这里深刻研究和了解汇编的人多,望不吝赐教!
2#
发表于 2019-2-21 09:47:33 | 只看该作者
本帖最后由 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!或跳跃跨段!
回复

使用道具 举报

3#
 楼主| 发表于 2019-2-21 13:21:12 | 只看该作者
寥寥数语,茅塞顿开。谢谢!
回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-11-28 05:10

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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