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

我的博客

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

[2011-06-20 12:52] 第9章,实验8 分析一个奇怪的程序

分析下面的程序,在运行前思考:这个程序可以正确返回吗?
运行后再思考:为什么是这种结果?
通过这个程序加深对相关内容的理解。
assume cs:codesg
codesg segment
        mov ax,4c00h      ;8)
        int 21h           ;9)

start:  mov ax,0          ;1)程序由这里开始执行
    s:  nop               ;7)此处已被改写为jmp short FLAG,而这个FLAG是多少呢?请看后面的解析。(解析2)
        nop

        mov di,offset s   ;2)DI为S的地址偏移
        mov si,offset s2  ;3)SI为S2的偏移
        mov ax,cs:[si]    ;4)S的地址偏移存入AX
        mov cs:[di],ax    ;5)S2处的汇编指令写入S处(解析1)

   s0:  jmp short s       ;6)跳转至S

   s1:  mov ax,0
        int 21h
        mov ax,0

   s2:  jmp short s1
        nop

codesg ends
end start

解:
本题主要是考虑对跳转指令的理解。
本题内的flag的值是这些:
start:5h
s:    8h
s0:   16h
s1:   18h
s2:   20h
那么:
(解析1)在程序被编译器编译时,标签被转换为地址,汇编转换为机器指令。那么s2:jmp short s1这句被转换为jmp short 18h-22h即EBF6(关于短转移的机器码格式请参见第178页,偏移计算方法请见180页,F6为-10的补码)。所以,实际上EBF6被复制到了s处,程序继续执行。
(解析2)程序继续执行,从s0处跳转至s处,s处目前的内容为EBF6,即跳转-10的偏移,s为8,从计算方法8位位移=标号地址-jmp指令后的第一个字节地址知道,这里的跳转是跳至jmp short s+2-10即8+2-10为0,跳转至0处执行,0处就是mov ax,4c00h。所以,程序正常执行并退出。
评论次数(1)  |  浏览次数(774)  |  类型(汇编作业) |  收藏此文  | 

[  游客   发表于  2011-10-12 16:14  ]

不错

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