鱼C论坛

 找回密码
 立即注册
查看: 2759|回复: 2

求详细解释,谢谢!!!

[复制链接]
发表于 2017-11-8 22:56:36 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
QQ截图20171108225500.png
QQ截图20171108225509.png
求详细解释,谢谢!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-11-9 08:05:05 | 显示全部楼层
这是间接转移,要使cs:ip指向第一条指令,就需要将数据段ds中相应的位置进行重新赋值。由于cs:ip 是由低位到高位存储,所以 ds:0中存放ip,ds:2中存放cs,  cs是系统中就有的,直接用就可以。这里就需要求偏移量ip,可以使用  word ptr 0   或者 offset start  。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-25 00:58:38 | 显示全部楼层
本帖最后由 兰陵月 于 2017-11-25 01:23 编辑

JMP FAR的解释如下(NASM环境):
001.png

王爽汇编语言(MASM环境)里有jmp dword ptr的解释,它实际上就是jmp far [内存单元]。如下图:
002.png

jmp dword ptr ds:[0]的解释如下:
用ds:[0]指向的那个字作为IP的值,
用ds:[0+2]指向的那个字作为CS的值,
形成CS:IP,jmp跳转到CS:IP处执行。

根据题目的要求,jmp后,要跳转到CS:IP指向的位置—第一条指令处执行。
而我们可以看到,程序中第一条指令位于标号start处。
也就是说,即将作为IP值的DS:[0]处存放的必须是标号start的地址,
即将作为CS值的DS:[0+2]处存放的必须是code段的段地址。
这样才能达到题目的要求,jmp执行后,跳转到程序第一条指令。
注:标号中存放的实际上就是标号相对于段起始位置的偏移,它会在编译之后直接变成一个数值。
此处标号start紧邻code段定义之后,它的偏移值起始就是0。也就是说start就等于0。


题目中bx已经赋值为0,因此带空格的两条指令实际上就是:
mov [0],____
mov [0+2],______
我们知道,指令中如果没有使用段超越前缀的话,默认的寄存器就是DS。
因此上面两条带空格的指令实际就是:
mov ds:[0],______
mov ds:[0+2],_______

这样题目回答起来就很简单了。
mov [bx], start
mov [bx+2], CS
也可以是(当然这种回答是很不科学,很不通用的!):
mov [bx], 0
mov [bx+2], CS

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-24 22:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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