图解在emu8086中学习汇编语言数字比较程序

打开emu8086,运行自带实例,数字比较程序;运行情况如下;

程序如下;

    此示例,前面是些cmp语句的用法示例;正式程序从 game: 标号开始;程序结构如下;

    msg1 定义字符串,提示用户输入一个字符;msg1后面是其他提示字符串定义;

    调用 int 21h 的09号子功能,在屏幕显示提示,让用户输入一个字符串;

    调用 int 21h 的01号子功能,从键盘读入一个字符到al;

    比较al 和 5,然后根据比较结果,分别执行 jb、ja,或执行 mov dx, offset equal_5;

    在屏幕输出比较结果;

    等待输入下一个字符;

 

    下面先复习一下汇编CMP指令;

CMP(比较)指令执行从目的操作数中减去源操作数的隐含减法操作,并且不修改任何操作数:
CMP destination,source

标志位
当实际的减法发生时,CMP 指令按照计算结果修改溢出、符号、零、进位、辅助进位和奇偶标志位。

如果比较的是两个无符号数,则零标志位和进位标志位表示的两个操作数之间的关系如下:
    CMP结果                        ZF       CF
    目的操作数 < 源操作数    0        1
    目的操作数 > 源操作数    0        0
    目的操作数 = 源操作数    1        0

CMP指令执行减法,不会改变源和目的操作数,影响标志位;

汇编cmp指令参阅此;

        http://c.biancheng.net/view/3561.html

 

在 070 行下一个断点,从debug菜单执行 run until;

    看一下此时,ah是前面语句设置的子功能号09,DX是msg1的偏移地址;

再往下,运行到需要键盘输入字符时,停住如下;

 

输入一个字符,比较后输出结果;运行到 071 行又停住,等待再次输入字符;

在 080 行下断点,即选中 080 行,从debug菜单执行run until;输入字符6,运行到80行停住,如下;

    此时ah是01h,这是070行设置的子功能号,没错;

    al是36h;没搞清,al此时我以为应该是从键盘读入的6,应该是06h;

从新执行,断在080行,键盘输入8;此时al是38h,按程序来看应该是从键盘读入的08h;

单步执行;运行到071行,此时进入dos系统空间,如下图蓝色选中片区所示,还未返回到用户程序的 071 行;

    此时al自己会变为24h;不知为何;此时键盘字符还未读入到al;

    这个好像是系统自己设置的;用户程序不会用到;

重新执行;每次都是如此;这个al的24h可能是系统自己用的;

如果运行到067行,如下,已经从系统空间返回到用户程序的067行;

    此时ah是09h,是066行设置的子功能号,没有问题;

    al是01h,最近一行影响到al的指令是060行,“mov al, 1”,把1放入al,没有问题;

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值