图解在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,没有问题;