2010汇编语言上机实验二
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
;多字节BCD码乘2子程序 MULTI PROC LEA DI,BCDBUF+5 ;从低位开始 MOV CL,5 CLC MUL1: MOV AL,[DI] ;取BCD码 ADC AL,AL ;乘2 AAA ;十进制数运算校正 MOV [DI],AL ;存BCD码 DEC DI DEC CL JNE MUL1 RET MULTI ENDP COSEG ENDS END HEXBCD
汇编语言上机实验(二) 4学时
国家级计算机实验示范中心
实验二 数制、码制和子程序的编程与调试
一.实验目的: 实验目的: 1. 熟练掌握编写汇编语言原程序的基本方法和基本框架。 2. 熟练使用DEBUG调试程序。 3. 掌握十六进制数与ASCII码之间,ASCII码与BCD码之间的转换。 4. 掌握用DOS功能调用,实现字符的输入和显示。 5. 掌握子程序的编程与调试方法。 二.实验内容: 实验内容: 1、从键盘输入两个2位十进制正数转换成二进制数后,对这两个数进行相加相乘 运算,结果以十六进制数形式显示在屏幕上。 2、从键盘输入两个2位十进制正数转换成组合BCD码后,对这两个数进行相加 相乘运算,结果以十进制形式显示在屏幕上。 3、从键盘输入一个4位十进制正数并回显后,将其对应的十六进制数显示在屏幕 上。
;多字节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 DI DEC CL JNE ADD1 RET ADDIT ENDP
2.
将ASCII码表示的4位十六进制数转换为16位二进制数,并暂时存放在 BX中;
3.
4.
5.
确定十进制数的符号,并把符号(+或-)存放在BCDBUF单元中; 使用指令TEST对最高位进行判定,如若最高位为1,则是负数,反之。 对BX中的二进制数采用前述算法转换为十进制数(非组合型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,0608H MOV BL,09H ADD AL,BL ;AL=08H+09=11H AAA ;十进制调整:AX=0107H
;确定十进制数的符号 MOV BCDBUF,'+' TEST BX,8000H JNS PLUS ;是正数 MOV BCDBUF,'-' ;是负数 NEG BX ;求补后变为原码 ;将二进制数转换为非组合型BCD码,从二进制数高位起,进行15次 加和乘 PLUS: MOV CH,0FH ; “加乘”运算的次数 LOP0: SHL BX,1 ;最高位二进制数送CF CALL ADDIT ;先加1位二进制数 CALL MULTI ;再乘2 DEC CH JNE LOP0 SHL BX,1 ;加最低位二进制数 CALL ADDIT
6.
显示结果
屏幕显示字符串(9号功能调用) 格式: MOV DX, 字符串的偏移地址 MOV AH, 09H INT 21H 在使用9号功能调用时,应当注意以下问题: ① 待显示的字符串必须先放在内存一数据区(DS段)中,且以‘$’符号 作为结束标志。 ② 应当将字符串首地址的段基址和偏移地址分别存入DS和DX寄存器中。 … … BUF DB ‘ ‘HOW DO YOU DO?’, 0AH, 0DH, ‘ ’ ’ ‘$’ … … MOV AX, DATA MOV DS, AX … … MOV DX, OFFSET BUF MOV AH, 09H INT 21H … … 执行程序,在屏幕上显示“HOW DO YOU DO?”字符串。
实验要求一参考程序:
TITLE CONVERT HEXADECIMAL TO BCD 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 STACK DW 20H DUP(0) STACK1 ENDS COSEG SEGMENT ASSUME CS:COSEG,DS:DATA,SS:STACK1 HEXBCD: MOV AX,DATA MOV DS,AX
部分dos功能调用列表
第二轮循环 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 Cl=0
程序详解
假定我们要对4位二进制数(0110)进行转换。首先BX=0110,设置的BCDBUF为 三个字节空间,Ch=3 Lop0: bx=1100 cl=2 cf=0 执行call addit 有: al=0 adc al,0 ;al=0 aaa ;al=0 cl=1;重复有: al=0 adc al,0 ;al=0 aaa ;al=0 cl=0 执行call multi 有: cf=0 cl=2 al=0 adc al,0 ;al=0 aaa ;al=0 cl=1 ;重复有: al=0 adc al,0 ;al=0 aaa ;al=0 cl=0
;输入1~4位十六进制数 LEA DX,PROMPT ;显示提示信息 MOV AH,09H INT 21H LEA DX,HEXBUF ;输入数据 MOV AH,0AH INT 21H
;ASCII码转换为16位二进制数并存入BX中 LEA SI,HEXBUF+2 ;取十六进制数ASCII码首址 MOV BX,0 ;暂存二进制数的寄存器清零 MOV CH,HEXBUF+1 ;取输入数据个数 HEX1: MOV AL,[SI] ;取一个十六进制数字符 CMP AL,'9' JBE NUMB ;小于等于‘9’是数字符 SUB AL,07H ;是字母符 NUMB: AND AL,0FH MOV CL,4 SAL BX,CL OR BL,AL INC SI DEC CH JNE HEX1
10号功能调用举例:
补充说明:
16位正数补码表示范围 0000 0000 0000 0000~0111 1111 1111 1111 即:0~+32767 16位负数补码表示范围 1000 0000 0000 0000~1111 1111 1111 1111 即:-32768~-1 因此转换结果要预留6个字节空间(含符号)。
;把非组合型BCD码转换为ASCII码形式 LEA DI,BCDBUF+1 MOV CX,5 LOP1: OR BYTE PTR [DI],30H INC DI LOOP LOP1 ;显示结果 LEA DX,DISP MOV AH,09H INT 21H MOV AH,4CH ;程序结束 INT 21H
… … BUF DB 25 ; 缓冲区长度 ACTHAR DB ? ; 保留单元, 存放输入的实际字符个数 CHAR DB 25 DUP (?) ; 定义25个字节存储空间 DB ‘$’ … … 字符 对应的ASCII码 MOV AX, DATA MOV DS, AX 0~9 30H~39H … … MOV DX, OFFSET BUF A~Z 41H~5AH MOV AH, 0AH 0AH INT 21H 换行 … … 0DH 回车 本例可从键盘接收23个 1BH ESC键 有效字符并存入以BUF 20H 空格 为首地址的缓冲区中。
三、实验要求及调试步骤
1.
程序说明。说明程序的功能、结构。 调试说明。包括上机调试的情况、上机调试步骤、调试所遇到的 问题是如何解决的,并对调试过程中的问题进行分析,对执行结 果进行分析。 写出源程序清单和执行结果。
2.
3.ห้องสมุดไป่ตู้
【举例】从键盘输入4位十六进制数(它对应的二进制数是补码表示 的带符号数),把它们转换为带符号非组合型BCD码,并在屏幕 上显示出来。
第三轮循环 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
1.
从键盘输入1~4位十六进制数,存放在以HEXBUF+2为首址的4个字节单元中。其中 HEXBUF+1单元中为输入的数据个数。
字符串输入功能调用(0AH号功能调用) 格式: MOV DX, 已定义缓冲区的偏移地址 MOV AH, 0AH INT 21H 功能:从键盘接收字符,并存放到内存缓冲区。 ① 执行前先定义一个输入缓冲区,缓冲区内第一个字节定义为允许最多输入 的字符个数,字符个数应包括回车符0DH在内,不能为“0”值。第二个字 节保留,在执行程序完毕后存入输入的实际字符个数。从第三个字节开 始存入从键盘上接收字符的ASCII码。若实际输入的字符个数少于定义的 最大字符个数,则缓冲区其他单元自动清0。若实际输入的字符个数大于 定义的字符个数,其后输入的字符丢弃不用,且响铃示警,一直到输入 回车键为止。整个缓冲区的长度等于最大字符个数再加2。 ② 应当将缓冲区首地址的段基址和偏移地址分别存入DS和DX寄存器中。