软件07汇编语言程序设计课程设计参考答案
课程设计1:键盘输入数据的转换与显示程序
编写一个程序,能从键盘读入两个5位十进制数(1位符号位和4位数值位),并将这两个十进制数分别转换为二进制数,然后求其和,再将和以十进制形式进行显示。
要求:提示从键盘输入第一个数,按回车完成输入;然后提示从键盘输入第二个数,按回车完成输入。然后显示输入的两个数的和。能够从键盘输入-9999~+9999之间的数值。
提示:该程序主要练习十进制数和二进制数之间的相互转换。从键盘输入的数据一般是用十进制表示的,而这些数在计算机内存储、运算时一般用二进制,这就涉及到十进制数向二进制数的转换问题;当计算结果需要显示或打印时,又要将二进制数转换为十进制数,这又涉及到二进制数如何转换为十进制的问题。建议用两个子程序来分别完成ASCII码转换为二进制数和二进制数转换为对应十进制数的ASCII码的功能。
参考:教材P55 INT 21H的0AH号功能的介绍。
;*****************************************
;proj_1.asm
;*****************************************
OUTCHAR MACRO CHAR
MOV AH,2
MOV DL,CHAR
INT 21H
endm
OUTSTRING MACRO STRING
MOV AH,9
LEA DX,STRING
INT 21H
endm
INCHAR MACRO
MOV AH,1
INT 21H
endm
INSTRING MACRO STRING
MOV AH,10
LEA DX,STRING
INT 21H
endm
DATA SEGMENT
STR1 DB 0DH,0AH,'Please input an integer:$'
STR2 DB 0DH,0AH,'Please input another integer:$'
STR3 DB 0DH,0AH,'The result is:$'
BUF DB 6
DB ?
DB 6 DUP(?)
ARRAY DW 2 DUP(0)
DATA ENDS
STACK SEGMENT
DB 200 DUP(0)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,SS:STACK,DS:DATA
BEGIN:
MOV AX,DATA
MOV DS,AX
OUTSTRING STR1
INSTRING BUF
LEA DI,ARRAY
CALL FAT10
OUTSTRING STR2
INSTRING BUF
CALL FAT10
OUTSTRING STR3
MOV AX,ARRAY
MOV BX,ARRAY+2
ADD AX,BX
CALL F2T10
QUIT: MOV AH,4CH
INT 21H
;子程序名:FAT10(From ASCII To 10)
;功能:将内存缓冲区内连续输入的ASCII码转换成十进制数,存放在ARRAY中
;入口参数:DI--转换后的十进制数字存放地址
;出口参数:DI--指向最后转换的十进制数字的下一个字
FAT10 PROC
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH SI
CALL CONVERT
LEA SI,BUF+3
MOV AL,[SI]
MOV AH,0
MOV CL,BUF+1
MOV CH,0
SUB CX,2
CMP CX,0
JZ T1
LOP: INC SI
MOV BL,[SI]
MOV BH,0
MOV DX,10
IMUL DX
ADD AX,BX
LOOP LOP
T1: CMP BUF+2,'+'
JZ T2
NEG AX
OR AX,8000H
T2: MOV [DI],AX
ADD DI,2
POP SI
POP DX
POP CX
POP BX
POP AX
ret
FAT10 endp
;子程序名:CONVERT
;功能:将内存缓冲区内连续输入的ASCII码转换成数字
CONVERT PROC
PUSH CX
PUSH SI
MOV CL,BUF+1
MOV CH,0
DEC CX
LEA SI,BUF+3
LOP: SUB BYTE PTR[SI],30H
INC SI
LOOP LOP
POP SI
POP CX
ret
CONVERT endp
;子程序名:F2T10
;功能:将AX中16位带符号二进制数转换成十进制数,并显示
F2T10 PROC NEAR
PUSH BX
PUSH DX
PUSH SI
LEA SI,BUF
OR AX,AX
JNS PLUS ;(AX)≥0转PLUS
NEG AX
MOV [SI],BYTE PTR '-' ;负数输出'-'
INC SI
PLUS: MOV BX,10 ;基数10→BX
CALL RADIX ;调用二进制转换成十进制子程序
MOV [SI],BYTE PTR '$'
MOV DX,OFFSET BUF
MOV AH,9
INT 21H ;显示转换后的十进制数
POP SI
POP DX
POP BX
RET
F2T10 ENDP
;子程序名:RADIX
;功能:将二进制转换成十进制
;入口参数:AX--存放待转换的十六位二进制数;BX--存放要转换的数制基数P;SI--存放P进制的字节存储区首址
;出口参数:所求P进制数各位数字的ASCII码按高位在前、低位在后的顺序存放在以SI为指针字节存储区,SI指向最后一个ASCII码的下一字节
RADIX PROC NEAR
PUSH CX
PUSH DX
MOV CX,0
LP1: MOV DX,0
DIV BX
PUSH DX
INC CX
OR AX,AX
JNE LP1
LP2: POP AX
CMP AL,10
JB K1
ADD AL,7
K1: ADD AL,30H
MOV [SI],AL
INC SI
DEC CX
JNZ LP2
POP DX
POP CX
RET
RADIX ENDP
CODE ENDS
END BEGIN
课程设计2:显示系统的当前日期和时间。
要求设计界面提示信息为:“Please input DATE(D) OR TIME(T) OR QUIT(Q):”,从键盘键入“D”,可显示系统日期。从键盘输入“T”,可显示系统时间。从键盘输入“Q”,退出程序。利用DOS的系统功能调用的2AH和2CH功能调用,读取系统日期和时间。将日期和时间转换为相应的ASCII码字符,显示在屏幕上。
;*****************************************
;proj_2.asm
;*****************************************
OUTCHAR MACRO CHAR
MOV AH,2
MOV DL,CHAR
INT 21H
ENDM
OUTSTR MACRO STRING
MOV AH,9
LEA DX,STRING
INT 21H
ENDM
DATA SEGMENT
STR1 DB 0DH,0AH,'Please input DATE(D) OR TIME(T) OR QUIT(Q):$'
STR2 DB 0DH,0AH,'Input Error!$'
STR3 DB 0DH,0AH,'Current Date:$'
STR4 DB 0DH,0AH,'Current Time:$'
BUF DB 20 DUP(?)
DATA ENDS
STACK SEGMENT
DB 200 DUP(0)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,SS:STACK,DS:DATA
BEGIN:
MOV AX,DATA
MOV DS,AX
LOP: OUTSTR STR1