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

我的博客

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

[2009-08-08 14:24] 实验8中的小陷阱

assume cs:codesg
codesg segment

mov ax,4c00h
int 21h
start:
 
    mov ax,0
 s:
    nop  ;现在还没有用,一会将被覆盖。
    nop
    mov di,offset s   ;把标号s的偏移地址赋给di
    mov si,offset s2  ;把标号s2的偏移地址赋给si
    mov ax,cs:[si]    ;[si]是s2的偏移地址,该语句把标号s2
                      ;处的语句jmp short s1(机器码:EBF6)
                      ;赋给了ax。
    mov cs:[di],ax    ;[di]是s的偏移地址,把寄存器ax中的数
                         ;据EBF6赋给cs:[di],呵呵,看到了吧:
                         ;标号s处的两个nop被覆盖了。
s0:
   jmp short s        ;现在跳到标号s处,从标号s处执行程序。
                         ;注意,标号s处的内容已被改变为EBF6。
......
......

    貌似现在要转到标号s处执行jmp short s1语句,这样看来,又要跳到标号s1去了(头晕眼花了吧)。可这是汇编语句,实际计算机要执行的是机器码:EBF6,计算机在编译时计算好了位移,它可不会再次跳到S1处,要警惕呀,别被王爽老师忽悠了。
    执行EBF6,看出来了吧,程序要位移F6位,F6为10进制的246,不符合短转移的-128~+127要求,因此只能是负数。256-246=10,所以要向后(执行了EBF6后)位移10个IP。数数IP吧,它将跳到mov ax,4c00h语句。

    上机实验,呵呵.....正确。
评论次数(0)  |  浏览次数(405)  |  类型(默认类型) |  收藏此文  | 
 
 请输入验证码  (提示:点击验证码输入框,以获取验证码