【实验目的】
掌握多数位的算术运算、移位操作、字符串操作等程序的设计,学习使用分支与循环等基本编程方法,熟练使用Debug。
【实验内容】
【1】在数据段预先存放16个十六进制数的ASCII码,首地址为ASC。从键盘输入一位十六进制数到BX,用ASC[BX]寻址方式找到对应数位的ASCII码,并取出显示。
【2】用16位指令编制程序,处理32位的加减乘除算术四则运算题。
要求:
(1)所有变量均定义成字类型,其中应有负数。部分变量也可以使用寄存器,在Debug下临时给出。程序必须在Debug下执行,以便验证结果。
(2)跟踪程序,记录每条指令执行后的ZF,SF,CF,OF标志。回答每条指令执行后ZF,SF,CF,OF标志设置的理由。
【4】AL字节内容反向排序。
【实验问题与解决】
【1】代码3-1.asm:
运行测试(第一个字符为输入,第二个为输出。符合预期结果):
【2】Part1:32位数加减法
实验思路:令A=142857(00022E09H),B=666666(000A2C2A),令寄存器AX、BX分别存放A的高位和低位,CX、DX分别存放B的高位和低位。
编写如下代码3-2-1.asm:
编译链接(略)后使用debug单步执行,执行运算前各寄存器状态如下:
单步执行,各寄存器状态如下:
运算结果:加法的答案为(AX,BX)=(000C 5A33)=142857+666666;减法的答案为(CX,DX)=(FFFD D1F7)=-A(-142857的补码),均符合预期。
各标志位变化如下表:
ZF | SF | CF | OF | |
开始前 | NZ | PL | NC | NF |
ADD BX,DX | PL | NC | ||
ADC AX,CX | PL | NC | ||
SUB DX,BX | NG | CY | ||
SBB CX,AX | NG | CY |
解释:ZF为是否为零,全程均未出现运算结果未0;OF为是否溢出,全程也未出现过溢出;SF为符号位,在加法运算时结果显然为正;在减法运算是由于减数大于被减数,所以符号为负;CF为是否有进位,在加法时低位没有向高位进位,而最后减法时进行了借位。
Part2:32位数乘除法
令AX=2333(091DH),BX=6666(1A0AH),实验乘除法:
执行完乘法语句后(DX,AX)=(ED4D22H)=2333*6666;执行完除法后AX=(DX,AX)/BX=原来的a,符合题意。
【4】思路:将结果存放在寄存器BL中,每次令BL左移一位后加上BL除以2得到的余数,重复8次BL的值即为AL字节内容反向排序的结果。
代码3-4.asm:
编译链接:
使用debug进行测试
可以看到BL的值为4BH(01001011B),为原来AL=11010010B的反向排序。