1、汇编语言上机实验(二) 4学时,国家级计算机实验示范中心,实验二 数制、码制和子程序的编程与调试,一实验目的:1. 熟练掌握编写汇编语言原程序的基本方法和基本框架。 2. 熟练使用DEBUG调试程序。 3. 掌握十六进制数与ASCII码之间,ASCII码与BCD码之间的转换。 4. 掌握用DOS功能调用,实现字符的输入和显示。 5. 掌握子程序的编程与调试方法。二实验内容:1、从键盘输入两个2位十进制正数转换成二进制数后,对这两个数进行相加相乘运算,结果以十六进制数形式显示在屏幕上。 2、从键盘输入两个2位十进制正数转换成组合BCD码后,对这两个数进行相加相乘运算,结果以十进制形式显示在屏幕上
2、。 3、从键盘输入一个4位十进制正数并回显后,将其对应的十六进制数显示在屏幕上。,三、实验要求及调试步骤程序说明。说明程序的功能、结构。调试说明。包括上机调试的情况、上机调试步骤、调试所遇到的问题是如何解决的,并对调试过程中的问题进行分析,对执行结果进行分析。写出源程序清单和执行结果。,【举例】从键盘输入4位十六进制数(它对应的二进制数是补码表示的带符号数),把它们转换为带符号非组合型BCD码,并在屏幕上显示出来。从键盘输入14位十六进制数,存放在以HEXBUF+2为首址的4个字节单元中。其中HEXBUF+1单元中为输入的数据个数。字符串输入功能调用(0AH号功能调用) 格式: MOV DX,
3、 已定义缓冲区的偏移地址 MOV AH, 0AH INT 21H 功能:从键盘接收字符,并存放到内存缓冲区。 执行前先定义一个输入缓冲区,缓冲区内第一个字节定义为允许最多输入的字符个数,字符个数应包括回车符0DH在内,不能为“0”值。第二个字节保留,在执行程序完毕后存入输入的实际字符个数。从第三个字节开始存入从键盘上接收字符的ASCII码。若实际输入的字符个数少于定义的最大字符个数,则缓冲区其他单元自动清0。若实际输入的字符个数大于定义的字符个数,其后输入的字符丢弃不用,且响铃示警,一直到输入回车键为止。整个缓冲区的长度等于最大字符个数再加2。 应当将缓冲区首地址的段基址和偏移地址分别存入DS
4、和DX寄存器中。, BUF DB 25 ; 缓冲区长度 ACTHAR DB ? ; 保留单元, 存放输入的实际字符个数 CHAR DB 25 DUP (?) ; 定义25个字节存储空间 DB $ MOV AX, DATA MOV DS, AX MOV DX, OFFSET BUF MOV AH, 0AH INT 21H 本例可从键盘接收23个有效字符并存入以BUF为首地址的缓冲区中。将ASCII码表示的4位十六进制数转换为16位二进制数,并暂时存放在BX中;,确定十进制数的符号,并把符号(+或-)存放在BCDBUF单元中;使用指令TEST对最高位进行判定,如若最高位为1,则是负数,反之。 对B
5、X中的二进制数采用前述算法转换为十进制数(非组合型BCD码),转换结果存放在以BCDBUF+1为首址的5个字节单元中; 把转换结果的5个非组合型BCD码形成相应的ASCII码。组合BCD码是用4个二进制位表示一个十进制位,如:MOV AL,68H MOV BL,28H ADD AL,BL ;AL=68H+28H=90H DAA ; 十进制调整:AL=96H 非组合BCD码是用8个二进制位表示一个十进制位。如:MOV AX,0608HMOV BL,09H ADD AL,BL ;AL=08H+09=11H AAA ;十进制调整:AX=0107H,显示结果屏幕显示字符串(9号功能调用) 格式: MO
6、V DX, 字符串的偏移地址 MOV AH, 09H INT 21H 在使用9号功能调用时,应当注意以下问题: 待显示的字符串必须先放在内存一数据区(DS段)中,且以$符号作为结束标志。 应当将字符串首地址的段基址和偏移地址分别存入DS和DX寄存器中。 BUF DB HOW DO YOU DO?, 0AH, 0DH, $ MOV AX, DATAMOV DS, AX MOV DX, OFFSET BUF MOV AH, 09H INT 21H 执行程序,在屏幕上显示“HOW DO YOU DO?”字符串。,实验要求一参考程序:,TITLE CONVERT HEXADECIMAL TO BCD
7、DATA SEGMENT PROMPT DB “INPUT HEXADECIMAL(4DIGITS):$ HEXBUF DB 5,0,5 DUP(0) DISP DB 0AH,0DH BCDBUF DB 6 DUP(0),$ DATA ENDS STACK1 SEGMENT PARA STACKDW 20H DUP(0) STACK1 ENDS COSEG SEGMENTASSUME CS:COSEG,DS:DATA,SS:STACK1 HEXBCD: MOV AX,DATAMOV DS,AX,;输入14位十六进制数LEA DX,PROMPT ;显示提示信息MOV AH,09HINT 21HL
8、EA DX,HEXBUF ;输入数据MOV AH,0AHINT 21H,;ASCII码转换为16位二进制数并存入BX中LEA SI,HEXBUF+2 ;取十六进制数ASCII码首址MOV BX,0 ;暂存二进制数的寄存器清零MOV CH,HEXBUF+1 ;取输入数据个数 HEX1: MOV AL,SI ;取一个十六进制数字符CMP AL,9JBE NUMB ;小于等于9是数字符 SUB AL,07H ;是字母符 NUMB: AND AL,0FH MOV CL,4SAL BX,CLOR BL,ALINC SIDEC CHJNE HEX1,;确定十进制数的符号MOV BCDBUF,+TEST B
9、X,8000HJNS PLUS ;是正数MOV BCDBUF,- ;是负数NEG BX ;求补后变为原码 ;将二进制数转换为非组合型BCD码,从二进制数高位起,进行15次加和乘 PLUS: MOV CH,0FH ; “加乘”运算的次数 LOP0: SHL BX,1 ;最高位二进制数送CFCALL ADDIT ;先加1位二进制数CALL MULTI ;再乘2DEC CHJNE LOP0SHL BX,1 ;加最低位二进制数CALL ADDIT,;把非组合型BCD码转换为ASCII码形式 LEA DI,BCDBUF+1MOV CX,5 LOP1: OR BYTE PTR DI,30HINC DILO
10、OP LOP1 ;显示结果LEA DX,DISPMOV AH,09HINT 21HMOV AH,4CH ;程序结束INT 21H,;多字节BCD码加1位二进制数子程序 ADDIT PROC LEA DI,BCDBUF+5 ;从低位开始MOV CL,5 ;取字节数 ADD1: MOV AL,DI ;取BCD码ADC AL,0 ;加二进制数位(CF)AAA ;十进制数运算校正MOV DI,AL ;存BCD码DEC DIDEC CLJNE ADD1RET ADDIT ENDP,;多字节BCD码乘2子程序 MULTI PROCLEA DI,BCDBUF+5 ;从低位开始MOV CL,5CLC MUL1
11、: MOV AL,DI ;取BCD码ADC AL,AL ;乘2AAA ;十进制数运算校正MOV DI,AL ;存BCD码DEC DIDEC CLJNE MUL1RET MULTI ENDP COSEG ENDSEND HEXBCD,程序详解 假定我们要对4位二进制数(0110)进行转换。首先BX=0110,设置的BCDBUF为三个字节空间,Ch=3,Lop0: bx=1100 cl=2 cf=0执行call addit 有:al=0adc al,0 ;al=0aaa ;al=0cl=1;重复有:al=0adc al,0 ;al=0aaa ;al=0cl=0,执行call multi 有:cf=
12、0 cl=2 al=0adc al,0 ;al=0aaa ;al=0cl=1 ;重复有:al=0adc al,0 ;al=0aaa ;al=0cl=0,第二轮循环 ch=2 bx=1000 cf=1,Lop0:cl=2 Call addit有: Al=0 Adc al,0 ;al=1 Aaa ;al=1 Cl=1 cf=0重复有: Al=0 Adc al,0 ;al=0 Aaa ;al=0 Cl=0,Cl=2 cf=0Call multi有: Al=1 Adc al,al ;al=2 Aaa ;al=2 Cl=1 cf=0重复有: Al=0 Adc al,al ;al=0 Aaa ;al=0
13、Cl=0,第三轮循环 ch=1 bx=0000 cf=1 (该轮循环结束后CH=0,不再循环),Lop0:cl=2 Call addit有: Al=2 Adc al,0 ;al=3 Aaa ;al=3 Cl=1 cf=0重复有: Al=0 Adc al,0 ;al=0 Aaa ;al=0 Cl=0,Cl=2 cf=0Call multi有: Al=3 Adc al,al ;al=6 Aaa ;al=6 Cl=1 cf=0重复有: Al=0 Adc al,al ;al=0 Aaa ;al=0 Cl=0,10号功能调用举例:,补充说明: 16位正数补码表示范围 0000 0000 0000 00000111 1111 1111 1111 即:0+32767 16位负数补码表示范围 1000 0000 0000 00001111 1111 1111 1111 即:-32768-1 因此转换结果要预留6个字节空间(含符号)。,部分dos功能调用列表,