王爽汇编中的一个问题,请大家进来看看谈谈聊聊!

yiruirui0507 2010-09-03 10:15:36
实验8 分析一个奇怪的程序(第174页)
---------------------------------

分析下面的程序,在运行前思考:这个程序可以正确返回吗?

运行后再思考:为什么是这种结果?

通过这个程序加深对相关内容的理解。

assume cs:codesg

codesg segment

mov ax,4c00h

int 21h



start:

mov ax,0

s:

nop

nop



mov di,offset s

mov si,offset s2

mov ax,cs:[si]

mov cs:[di],ax

s0:

jmp short s



s1:

mov ax,0

int 21h

mov ax,0



s2:

jmp short s1

nop



codesg ends

end start

个人分析:mov di,offset s

mov si,offset s2

mov ax,cs:[si]

mov cs:[di],ax
这四行代码意思是把S2处的指令复制到S处。刚开始顺序执行,然后执行到S0处,此时那四行代码已经被执行过,就是S2处的指令已经放到了S处了,这个时候执行的指令是:jmp short s1 ,此时执行
s1:

mov ax,0

int 21h

mov ax,0
然后结束。
以上是我的分析过程,不过是错误的,请高手们给分析分析,谢谢了先!
...全文
70 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
paullbm 2010-09-03
  • 打赏
  • 举报
回复
程序可以正常返回。



详细分析:

在此题中较为深入地考察了‘段内直接短转移’[形如:jmp short 标号]的概念。

我们知道程序中:

mov di,offset s

mov si,offset s2

mov ax,cs:[si]

mov cs:[di],ax

四条指令的作用是将标号s2处的一条指令复制到标号s处。这时我们应该关心所复制的语句"jmp short s1"对程序的影响:我们知道在段内直接短转移指令所对应的机器码中,并不包含转移的目的地址,而包含的是转移的位移量(如对此概念还不太熟悉,请查看书中第167页的内容)。也就是说,在源程序的编译过程中,编译器遇到‘段内直接短转移’[形如:jmp short 标号]时就会自动算出其要跳转的位移量,以便程序在执行‘段内直接短转移’的指令时就根据位移量进行(向前或向后)跳转。通过调试中的U命令我们可以看到指令's2:jmp short s1'所对应的机器码是EBF6,F6h(-10d的补码)就是跳转的位移量[此位移量也可由指令's2:jmp short s1'处的偏移地址18h减去指令's2:jmp short s1'后一个字节的偏移地址22h得出]。这时我们就知道了其实复制到标号s处的指令所对应的机器码就是EBF6(刚好取代两个nop所对应的机器码),它的作用就是将当前IP向前移动10个字节。当程序执行标号s0处的指令后,程序便跳到标号s处接着执行标号s处的指令。s处的指令的作用是向前跳10字节,于是便跳到了代码中的第一条指令,继续执行后便实现了程序的正常返回。

[注意:此程序不会也不可能执行标号s1处后的指令。]

paullbm 2010-09-03
  • 打赏
  • 举报
回复
王爽汇编参考答案中有详尽的解释。
ldlihuanfa 2010-09-03
  • 打赏
  • 举报
回复
我给楼主一个建议,你去汇编语言论坛http://www.asmedu.net/bbs/forum.jsp
那儿就是以王爽的书每个章节单独开区的,所有的常见问题都可以在那儿找到答案,你这个问题在那儿有详细的分析
yiruirui0507 2010-09-03
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 ldlihuanfa 的回复:]
我给楼主一个建议,你去汇编语言论坛http://www.asmedu.net/bbs/forum.jsp
那儿就是以王爽的书每个章节单独开区的,所有的常见问题都可以在那儿找到答案,你这个问题在那儿有详细的分析
[/Quote]

非常感谢德华兄的关照,谢谢!
yiruirui0507 2010-09-03
  • 打赏
  • 举报
回复
这里我来给大家回答一下这个问题吧,相信大家 仔细看还是能看出楼上问题的。
一步一步的跟踪结果:
0B58:0016 EBF0 JMP 0008H
0B58:0008H EBF6 JMP 0000 (我自己电脑中的数据)

0B58:0000 B8004C MOV AX,4C00
从这里开始分析,首先IP=16H(16进制)
此时细节如下:1。从IP=0016H中取指令,然后IP=IP+2(指令长度,不罗嗦)
2。此时IP执行0018H,
3。CPU执行 EBF0 则 IP=18H-16=8(注意F0是-16的补码,16是10进制,注意这里)
此时IP=0008H
然后从0008H中取指令,此时的指令为S2处的指令,前面4条指令已经把覆盖过了,这里的指令为JMP SHORT S1
他其实已经把S处的NOP NOP两个字节给覆盖了。
然后IP=IP+2(指令长度)=000AH
然后执行指令 EBF6 都知道F6是-10的补码,则IP=000AH-10(10进制,别糊涂了)=0H
则此时IP=0,也就是第一条指令的位置。OK,完毕!大家在琢磨琢磨吧!
yiruirui0507 2010-09-03
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 paullbm 的回复:]
程序可以正常返回。



详细分析:

在此题中较为深入地考察了‘段内直接短转移’[形如:jmp short 标号]的概念。

我们知道程序中:

mov di,offset s

mov si,offset s2

mov ax,cs:[si]

mov cs:[di],ax

四条指令的作用是将标号s2处的一条指令复制到标号s处。这时我们应该关心所复制的语……
[/Quote]
感谢你的答案!不过,你的答案过于粗糙,看我的答案吧,琢磨了半天终于明白了!答案如下;

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧