1、实验二 实验目的:1. 掌握顺序结构程序的基本设计方法;2. 掌握数据传送指令和算术运算指令的用法;3. 掌握逻辑操作指令和移位操作指令的用法;4. 掌握状态标志位操作指令的用法;5. 掌握简单的 I/O 功能调用。实验要求1. 熟练掌握 DEBUG 中的 U,D,E,G 命令的使用方法;2. 学会利用系统功能调用,来实现键盘输入字符、显示字符的方法;3. 了解大、小写字母及数字在计算机中的表示方法及转换方法。实验内容题目编写十六进制的乘法程序。要求从键盘上输入两个一位十六进制数据,乘积存入 SUM 单元以下是我的汇编程序代码:DSEG SEGMENTSUM DW ?HTAB DB 01234
2、56789?ABCDEFHTAA DB 0123456789ABCDEFDSEG ENDSCSEG SEGMENTASSUME CS:CSEG,DS:DSEGSTART: MOV AX,DSEGMOV DS,AXMOV AH,01HINT 21HMOV DL,*MOV AH,02HINT 21HSUB AL,30HLEA BX,HTABXLATMOV DL,ALMOV AH,01HINT 21HSUB AL,30HXLAT MOV BL,DLMUL BLMOV SUM,AXMOV BL,ALMOV CL,ALMOV DL,=MOV AH,02HINT 21HSHR BL,4MOV AL,BLL
3、EA BX,HTAAXLATMOV DL,BLMOV AH,02HINT 21HAND CL,0FHMOV AL,CLXLATMOV DL,ALMOV AH,02HINT 21HMOV DL,HMOV AH,02HINT 21HMOV AH,4CHINT 21HCSEG ENDSEND START结果该程序不仅将结果存入了 sum,且显示在了屏幕上,经测试无溢出。调试,改错在实验过程中,有几个问题出现了,首先,一开始在编写代码过程中,由于我没有给输入内容表加逗号,导致数据溢出而使编译无法通过,经过修改后终于通过了编译。但是之后结果一直都显示为同一个数字,经过单步指令语言执行后,我得到了以下的结
4、果:在执行 INT 21H 指令后,AL 寄存器中的内容被改变,于是我将 AL 用 DL 保存起来后重新执行,发现仍然会显示乱码,进一步进行单步指令执行后,我发现,寄存器 AL,在转存过程中被我记成了 BL。经过修改终于完成。以下是正确的反汇编内容以及储存器的最终状态以及内存的最终状态,其中 0000 为 SUM 以 3*A=1E 为例, sum 在第一个单元内。一开始我编写了一个利用转移指令完成的汇编程序,能够顺利将结果保存到 AX,和sum 中如下:SSEG SEGMENT STACKSTK DB 20 DUP(0)SSEG ENDSDSEG SEGMENTSUMDW ?DSEG ENDS
5、CSEG SEGMENTASSUME CS:CSEG,DS:DSEGASSUME SS:SSEGSTART: MOVAX,DSEGMOV DS,AXMOV AX,SSEGMOV SS,AXMOV SP,LENGTH STKMOV AH,01HINT 21HCMPAL,AJAE ABOVE1SUB AL,0MOV BL,ALJMP NEXT1ABOVE1: SUB AL,AADD AL,10MOV BL,ALNEXT1: MOV AH,01HINT 21HCMPAL,AJAE ABOVE2SUB AL,0JMP NEXT2ABOVE2: SUB AL,AADD AL,10NEXT2: MULBLMOV SUM,AXMOV AH,4CHMOV AL,0INT 21HCSEG ENDSEND START以下是反汇编内容以下是输入及输出结果即 3*A=1E