汇编网首页登录博客注册
kingwrcy的学习博客
博客首页博客互动【做检测题】论坛求助

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  
图片载入中
学习动态
最新留言
好友圈
文章收藏
友情链接

[2009-04-11 19:59] 实验八

这个题目比较古怪.又卡了半天.最后分析如下:

-r
AX=0000  BX=0000  CX=0023  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=0BE4  ES=0BE4  SS=0BF4  CS=0BF4  IP=0005   NV UP EI PL NZ NA PO NC
0BF4:0005 B80000        MOV     AX,0000
-t

AX=0000  BX=0000  CX=0023  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=0BE4  ES=0BE4  SS=0BF4  CS=0BF4  IP=0008   NV UP EI PL NZ NA PO NC
0BF4:0008 90            NOP
-t

AX=0000  BX=0000  CX=0023  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=0BE4  ES=0BE4  SS=0BF4  CS=0BF4  IP=0009   NV UP EI PL NZ NA PO NC
0BF4:0009 90            NOP
-t

AX=0000  BX=0000  CX=0023  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=0BE4  ES=0BE4  SS=0BF4  CS=0BF4  IP=000A   NV UP EI PL NZ NA PO NC
0BF4:000A BF0800        MOV     DI,0008
-t

AX=0000  BX=0000  CX=0023  DX=0000  SP=0000  BP=0000  SI=0000  DI=0008
DS=0BE4  ES=0BE4  SS=0BF4  CS=0BF4  IP=000D   NV UP EI PL NZ NA PO NC
0BF4:000D BE2000        MOV     SI,0020

-t

AX=0000  BX=0000  CX=0023  DX=0000  SP=0000  BP=0000  SI=0020  DI=0008
DS=0BE4  ES=0BE4  SS=0BF4  CS=0BF4  IP=0010   NV UP EI PL NZ NA PO NC
0BF4:0010 2E            CS:
0BF4:0011 8B04          MOV     AX,[SI]                            CS:0020=F6EB
-t

AX=F6EB  BX=0000  CX=0023  DX=0000  SP=0000  BP=0000  SI=0020  DI=0008
DS=0BE4  ES=0BE4  SS=0BF4  CS=0BF4  IP=0013   NV UP EI PL NZ NA PO NC
0BF4:0013 2E            CS:
0BF4:0014 8905          MOV     [DI],AX                            CS:0008=9090
-t

AX=F6EB  BX=0000  CX=0023  DX=0000  SP=0000  BP=0000  SI=0020  DI=0008
DS=0BE4  ES=0BE4  SS=0BF4  CS=0BF4  IP=0016   NV UP EI PL NZ NA PO NC
0BF4:0016 EBF0          JMP     0008

程序中

mov di,offset s
                        
mov si,offset s2
                        
mov ax,cs:[si]
                        
mov cs:[di],ax
就是把s2处的内容复制到s处了.我们一步步走下来,到
s0:jmp short s 可以发现.debug里面的代码是
0BF4:0016 EBF0          JMP     0008
也就是跳到0008所在的地方.我们查看下0008的地方是什么.

-u 0bf4:0
0BF4:0000 B8004C        MOV     AX,4C00
0BF4:0003 CD21          INT     21
0BF4:0005 B80000        MOV     AX,0000
0BF4:0008 EBF6          JMP     0000
0BF4:000A BF0800        MOV     DI,0008
0BF4:000D BE2000        MOV     SI,0020
0BF4:0010 2E            CS:
0BF4:0011 8B04          MOV     AX,[SI]
0BF4:0013 2E            CS:
0BF4:0014 8905          MOV     [DI],AX
0BF4:0016 EBF0          JMP     0008
0BF4:0018 B80000        MOV     AX,0000
0BF4:001B CD21          INT     21
0BF4:001D B80000        MOV     AX,0000
可以看到0008处的代码是jmp 0000.机器代码是EBF6.
其实这个ebf6就是刚才那四句话复制来的.也就是这个:
mov di,offset s
                        
mov si,offset s2
                        
mov ax,cs:[si]
                        
mov cs:[di],ax

s2处的内容复制到s处.而s2处的内容正好是EBF6,所以导致程序到了s处的时候会执行EBF6这个机器码.这个机器码翻译为汇编语言就是
JMP 0000,EBF6前面的EB是JMP的机器码.后面的F6是JMP的位移.F6是负数10的补码形式.所以这个EBF6的作用就是跳到ip=ip-10=0的地方.也就跳到了0BF4:0000 B8004C        MOV     AX,4C00,从而程序正常结束了.
评论次数(1)  |  浏览次数(728)  |  类型(汇编作业) |  收藏此文  | 

[  游客   发表于  2009-04-15 11:21  ]

嗯。分析的很正确。
注意体会jmp的执行原理。

 
 请输入验证码  (提示:点击验证码输入框,以获取验证码