通过一段代码发现 emu8086 和 DOSBox 的一点区别

来源:互联网 发布:xy苹果助手for mac 编辑:程序博客网 时间:2024/06/05 17:01

大家学习汇编语言的时候都需要一个能够编译执行的IDE。有的人用的win7或者更老的系统,就可以直接使用debug。而比较新的系统没有debug,就需要一个模拟器了,无论是DOSBox还是emu8086,都能满足我们学习的基本需求。
但是,这两种模拟器不是没有区别的,最近我就发现了一点小小的区别,希望能与大家分享一下。

1. 段内短转移

首先请看下面这段代码

assume cs:codesgcodesg segment  start:mov ax, 0        mov bx, 0        jmp short s        add ax, 1      s:inc axcodesg endsend start

这段代码很简单,我想我就不用详细介绍它的含义了。我们重点来看看这句:

jmp short s

这是一句段内短转移代码,它的作用是使得IPjmp下一句的代码直接跳到s标号所指示的地址(如果还不理解的话可以看一看王爽《汇编语言(第3版)》9.3节对此的解释)。那么这句代码在机器语言中怎样表示呢?我们分别用emu8086和DOSBox来看一看。

  1. emu8086

    emu8086——图中黄色部分为上述段内短转移语句,其中右侧为汇编伪代码,左侧为机器语言
    这张图是这段代码在emu8086中编译的结果。首先来看右侧的伪代码,上述段内短转移语句被解释为
jmp 0Bh


其中0Bh指的是最后那句

inc ax

的地址。也就是执行完上述段内短转移语句之后直接执行最后一句。
再看左侧的机器语言,这个语句被编译为EB 03。其中EB指的是jmp short,而03指的是从这个跳转语句的下一句跳到最后一句所需经过的位移。

  1. DOSBox

    DOSBox——图中红框部分为上述段内短转移语句,其中右侧为汇编伪代码,左侧为机器语言
    接下来看一下DOSBox的编译结果。基本内容和上面的一样,我就不多说了,大家自行体会。
    刚才也说了,上面这段代码其实是jmp的一种——段内短转移的对比效果,那么大家可以试一试另一种段内转移——段内近转移,最后得出的也会是一样的效果。
    看到这里也许有人说,这没什么区别啊,你是不是在逗我们?别急,我们现在才讲了一个jmp short,还有那么多其他类型的jmp,他们都没有区别吗?接下来我们以jmp far ptr段间转移)为例来讲讲这两个模拟器的区别,前面的只是为了做铺垫,方便大家看出他们的异同。

2. 段间转移

又是一段代码:

assume cs:codesgcodesg segment    start:        mov ax, 0        mov bx, 0        jmp far ptr s        db 256 dup (0)  ; 这里只是为了创造一段位移而复制了256个内容为0的字节      s:        add ax, 1        inc axcodesg endsend start

这是一句段间转移代码。作用与上面的段内短转移代码类似,不过顾名思义,这个可以跳转到任意地址。那么接下来我们看一下这段代码在两种模拟器中的编译结果。

  • emu8086

    emu8086——图中黄色部分为段间转移语句,其中右侧为汇编伪代码,左侧为机器语言
    这张图是这段代码在emu8086中编译的结果。首先来看右侧的伪代码,上述段内短转移语句被解释为
jmp 00109h


其中00109h指的是倒数第二句

add ax, 1

的地址。也就是执行完上述段间转移语句之后直接执行倒数第二句。
再看左侧的机器语言,这个语句被编译为E9 0100。其中E9指的是jmp far ptr,而0100指的是从这个跳转语句的下一句跳到倒数第二句所需经过的位移。
看起来好像没有什么问题,但是根据jmp far ptr语句的定义,它所跳转的地址应该是一个完整的地址,也就是段地址:偏移地址,而这里的机器语言却给出了位移量,也就是说,它实质上进行的还是段内转移,而不是段间转移。
这个时候有人就要问了,可是你只进行了100h的位移啊,当然是段内转移了。并不是这样,因为无论位移是多少,只要我用的是段间转移,那就必须是一个完整的地址,不能是位移量。即使就像这种说法说的那样,小于一个段的长度会变为段间转移,那大家可以试一试大于一个段的长度,比如进行2333h的位移,大家会发现机器语言给出的还是位移量。
这个现象我也无法解释,只能暂时说emu8086似乎并不能正确模拟段间转移。至于DOSBox是可以的。

  • DOSBox

    DOSBox——图中红框部分为上述段内短转移语句,其中右侧为汇编伪代码,左侧为机器语言
    这是DOSBox的编译结果,可以看到:
jmp far ptr s

被解释为如下伪代码:

jmp 076A:010B

其中076A:010B指的是要跳转到的段间地址
进而被编译为如下的机器语言:

EA 0B016A07

其中EA指的是jmp far ptr0B016A07指的是076A:010B
我们显然可以看出,对于段间转移,DOSBox的机器代码和emu8086有很大不同,DOSBox能够进行段间转移,而emu8086似乎并不具备这个功能。

3. 总结

通过以上对比我们可以看出,有些模拟器的功能并不健全,比如emu8086就不能进行段间转移,这个时候DOSBox就发挥作用了,虽然它很难使用,但是起码目前来看完全能够支持我们编写的代码,所以不要因为它又丑又难用就放弃它哦。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 微信钱包话费充值错误怎么办 微信转账到不了账也退不回是怎么办 求人办事微信发红包对方不收怎么办 微信上交了订金对方不退怎么办 交通事故对方伤员堵大门搂腿怎么办 电脑开机桌面文件都没了怎么办 qq飞车手游队长换了微信群怎么办 qq飞车手游登录授权失败怎么办 安装时提示安装包发现错误怎么办 苹果6p升级系统验证失败怎么办 w10开不了机无限重启怎么办 微信朋友圈里的表情图打不开怎么办 金立手机微信启动录音被拒绝怎么办 微信帐号解封后漂流瓶不能用怎么办 微信怎么在电脑上登不上去怎么办 玩旧版60级魔兽经常花屏怎么办? 我的世界手机版物品栏不见了怎么办 苹果手机掉进水里出现花屏该怎么办 球球大作战还没进去停止运行怎么办 ps3 e3硬破芯片坏了怎么办 电话打开后页面上没有东西怎么办 WPS在电脑安装后卸载不了怎么办 ps总要以管理员的身份打开怎么办 3d关的慢保存慢怎么办 无法与服务器建立可靠的连接怎么办 被抵押的房子开发商不解押怎么办 手机系统语言是英文没有中文怎么办 w7主机网插口灯不亮了没网怎么办 电脑用了5年变得很卡了怎么办 苹果6s系统占12g怎么办 百度网盘下载的压缩包打不开怎么办 三星手机微信安装包解析错误怎么办 下身流出来的东西有异味很重怎么办 鞋脚底总有一股酸臭的味道怎么办 腋窝总是有股酸臭的味道应该怎么办 房间里总是有灰尘的味道怎么办 香水喷多了衣服味道太呛怎么办 香水喷在衣服上变黄了怎么办 84喷在白衣服上变红怎么办 夏季高温多肉山地玫瑰砍头了怎么办 海水缸爆藻有些石头不出绿藻怎么办