. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->转移指令的原理
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  jmp near ptr 范围可以超出32767,操作系统位xp下虚拟 dos, 是编译器的原因么?  [待解决] 回复[ 1次 ]   点击[ 194次 ]  
hello_world
[帖 主]   [ 发表时间:2013-07-21 11:09 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2013-07-21 11:01
assume cs:code
code segment
start:  mov bx,0
        jmp near ptr s
        mov cx,2
        db  55000 dup (0)
s:      mov ax,9
code ends
end start
编译完全正常,运行正确,哪位高人讲讲是怎么回事?
a380556791
[第1楼]   [ 回复时间:2013-07-21 12:14 ]   [引用]   [回复]   [ top ] 
荣誉值:4
信誉值:0
注册日期:2013-05-23 21:42
楼主说的这个很有趣啊,我刚才也写了个从后面跳向前面的程序
assume cs:code 
code segment 
s:  mov bx,0 
        mov cx,2 
        db  65000 dup (0) 
        jmp near ptr s 
        mov ax, 4c00H
        int 21H
code ends 
end s
然后在debug里面调试了一下
在计算disp的时候jmp near ptr s的机器码是E90F02,而这个时候IP指向mov ax, 4c00H,为0FDF1H

又jmp跳转的时候是(IP)=(IP)+disp,所以执行完jmp near ptr s后IP=020FH+0FDF1H,指向了0000H

不论是在计算disp或者是计算IP,编译器均忽略了溢出问题,从而形成了一个跳转"循环"

然而是jmp short的话,在计算disp时,编译器则不会忽略溢出问题

个人猜测是CPU能计算16位数的算术运算,如果计算出的disp超出了-128~127,编译器能正确表示这个disp的值,但jmp short中存放disp的那个字节放不下所以会出错

而在jmp nert ptr中,如果溢出(超出-32768~32767),CPU仍然保留剩下的16位,就是说jmp nert ptr中存放disp的两个直接仍然能保存这个disp,所以没有编译出错

个人的一点假想,欢迎指错和探讨
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved