关于 王爽的汇编语言 试验8看不懂啊

实验8assumecs:codesgcodesgsegmentmovax,4c00hint21hstart:movax,0ax=0s:nop占一字节,机器码90nop占一... 实验8

assume cs:codesg

codesg segment

mov ax,4c00h

int 21h

start: mov ax,0 ax=0

s: nop 占一字节,机器码90

nop 占一字节,机器码90

mov di,offset s (di)=s偏移地址

mov si,offset s2 (si)=s2偏移地址

mov ax,cs:[si] (ax)=jmp short s1指令对应的机器码EBF6

mov cs:[di],ax jmp short s1覆盖s处指令2条nop指令

s0: jmp short s 执行s???? 未执行到这里,直接跳回mov ax,4c00h了

s1: mov ax,0

int 21h

mov ax,0

s2: jmp short s1

nop

codesg ends

end start

P180中关于jmp指令的位移内容

当指令执行到s0:jmp short s时,该指令得到执行,编译器算出的ip位移量为8-18h=-16(补码F0),(ip)=(ip)+位移量=18h+(-16)=8,cs:8指向s;

当指令执行到s标段jmp命令时,第1个字节中的机器码为EBF6,给出的ip位移量为-10(补码F6),(ip)=(ip)+位移量=ah+(-10)=0,cs:0指向第一条指令。

ah是多少? 为什么EBF6机器码可以对应JMP 0000 又能对应JMP 0018
展开
 我来答
wskjuf
2011-09-09 · TA获得超过1289个赞
知道大有可为答主
回答量:1731
采纳率:0%
帮助的人:1785万
展开全部
你应该从指令的含义上来理解。

jmp short s1 是短跳转,只包含了相对偏移。根据你的代码,它此处的含义是jmp -xxx ,注意-xxx 表示一个负的偏移。在s处也这样jmp -xxx后,它自然跳到了mov ax,4c00h 处。

你之所以不能理解是因为把这个s1和jmp指令硬联系在了一起,我再强调一次短跳转里没有包含s1的绝对地址。如果你用jmp far ptr s1,这样肯定会跳到s1,但这个地址是32位的,ax无法完全容纳,到时也会乱跳。
富港检测技术(东莞)有限公司_
2024-06-06 广告
ISTA3L是一个基于研究、数据驱动的测试协议,它模拟了由零售公司完成的产品订单被直接运送给消费者时所经历的危险,它允许用户评估包装产品的能力,以承受运输和处理包装产品时所经历的供应链危险,从接收到任何电子商务零售商履行操作,直到最终消费者... 点击进入详情页
本回答由富港检测技术(东莞)有限公司_提供
百度网友f6753a1fd
推荐于2018-04-26 · TA获得超过821个赞
知道小有建树答主
回答量:294
采纳率:0%
帮助的人:362万
展开全部
1493:0016 EBF0 JMP 0008 对应 s0: jmp short s

1493:0008 EBF6 JMP 0000 对应 jmp short s1

前面的意思是向上跳16个字节

后面那句的意思是向上跳10个字节

从这个例子里应该要学会看机器码,LZ仔细复习一下本章里面的jmp指令的本质
===================================================================
先说EBF0,EB是jmp,LZ已经知道了,F0的十进制是-16,书上说了,如果EB后面跟的是负数,表示向回跳,正数表示向前跳,16表示跳16个字节,所以EBF0的意思就是从本句指令的向前跳16个字节。本质就是当前的偏移地址+(-16)传给IP
再说EBF6 ,F6是十进制的-10,负数表示向前跳,10表示跳10个字节,所以本句的指令就是向前跳10个字节 。本质就是当前的偏移地址+(-10)传给IP
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
金牛初学java
2017-12-26
知道答主
回答量:3
采纳率:0%
帮助的人:2533
展开全部
我最近也搞懂这题,我说一下我的见解,首先程序中jmp short 标号的位移量,大家应该都知道怎么计算得了吧,就是标号处的偏移地址减去jmp指令的下一条指令偏移地址,那么这个实验八,楼主也知道了s标号处的两个nop变为了jmp short s1,当程序执行到jmp short s的时候,那么偏移量就为负数,那么就是往上跳,跳到了s标号处,我们知道s标号的两条nop指令现在变为jmp short s1,楼主也已经知道这条指令的偏移量为F0,那么换算二进制,最高为1,那么也就是负数,就是往上跳,然后就跳了mov ax,4c00h int 21h了,所以,自然也就程序中断,程序把使用权返回给系统,做这个实验,首先应该懂点原码和补码,还有反码,汇编中是用补码表示,正数和负数就看这个数的二进制形式的最高位是否为1或者0,1是负数,0是正数,还有就是如果jmp指令在程序执行顺序的前面,然后转移到下面的标号的话,那么位移量一定为正数,相反,偏移量则为负数,我希望我说得大家能看的懂,我觉得我写的已经够详细了吧,再看不懂,我就没辙了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
可爱的黄蝴蝶
2018-08-06
知道答主
回答量:19
采纳率:0%
帮助的人:1.4万
展开全部
那首先这题 你要是真的把 s 当成 jmp short s1 那就错了 如果是那样的话 ,你就会想当然的跳到s1那 但其实不是的 前边复制的 是内存里的内容 也就是说复制的是 jmp short s1 的机器码 假如机器码是这样的: EB -5(十进制负数先理解嘛~) 也就是向上走五个 那么 现在复制到s那 也是向上走五个 懂了没~
至于 这五个是怎么算的 楼下有答案 但我还是粘在这里吧
标号的地址 减去 jmp指令下一条指令的地址
至于为什么是下一条 我懒得说了~~ 但给你点提示吧 王爽第三版 p179
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
乌蝇哥啦lbTok
2019-11-26
知道答主
回答量:1
采纳率:0%
帮助的人:676
展开全部
那四个最长的语句的作用就是将S2中的jumpshort s1复制到S:的第一个nop那里,当执行完这四个最长的语句后往下执行S0:jumpshort s,此时跳到S:执行刚才复制过来的jumpshort s1,该指令原来的功能是偏移地址往上移,现在也是这个功能,所以就执行了上面反回程序的语句
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式