题目名称:键盘输入两个10位数以内(位数可变)十六进制数,求和并显示输出
题目来源:http://zhidao.baidu.com/question/129269410.html
*** 作说明:输入两个10位数以内(位数可变)十六进制数时,输足10位,自动结束输入;不足10位,按回车键结束输入。
Code Segment
Assume CS:Code,DS:Code
CR equ 000DH
LF equ 000AH
KBBack equ 0008H
-------------------------------------
功能:显示指定地址(Str_Addr)的字符串
入口:
Str_Addr=字符串地址(要求在数据段)
Output MACRO Str_Addr
lea dx,Str_Addr
mov ah,9
int 21h
EndM
-------------------------------------
功能:在当前光标位置显示一个字符
入口:dl=要显示的字符
Output_Chr proc Near
push ax
mov ah,02h
int 21h
pop ax
ret
Output_Chr Endp
-------------------------------------
功能:显示、输出一个回车、换行
Output_CTLF proc Near
push ax
push dx
mov ah,02h
mov dl,0dh
int 21h
mov dl,0ah
int 21h
pop dx
pop ax
ret
Output_CTLF Endp
-------------------------------------
功能:取光标位置
入口:无
出口:DH=行号,DL=列号
GetCursor Proc Near
PUSH DS
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH CS
POP DS
XOR BX,BX
MOV AH,3
INT 10H
MOV Cursor_Row,DH
MOV Cursor_Col,DL
POP DX
POP CX
POP BX
POP AX
POP DS
RET
Cursor_Row DB ?
Cursor_Col DB ?
GetCursor EndP
-------------------------------------
功能:置光标位置
入口:Cursor_Row=行坐标Cursor_Col: 列坐标)
SetCursor Proc Near
PUSH DS
PUSH DX
PUSH CX
PUSH BX
PUSH AX
PUSH CS
POP DS
MOV DH,Cursor_Row
MOV DL,Cursor_Col
XOR BX,BX
MOV AH,2
INT 10H
POP AX
POP BX
POP CX
POP DX
POP DS
RET
SetCursor EndP
-------------------------------------
功能:键盘输入一个指定位数(N)的十六进制数字,保存在指定的存储单元
输足N位的,自动结束输入;不足N位的,回车结束输入。
入口:@@Hexadec=数字位数,ds:di=输入数据保存地址
出口:保存在指定的存储单元
Input_Hex Proc Near
push es
push di
push cx
push ax
push ds
pop es
mov cx,cs:@@Hexadec 十六进制数位数
cld
push cx
xor al,al
rep stosb 数据缓冲区清零
pop cx
dec di
@@Input_Hex: call GetCursor 取光标位置
mov ah,1 从键盘接受一个字符
int 21h
cmp al,CR 回车?已经键入的十六进制字符不足N位
jz @@Return_Hex
cmp al,KBBack 回空键?
jz @@KB_Back 是,重新输入
cmp al,'0' 低于数字'0'?
jb @@KBBack 是,重新输入
cmp al,'9'低于或等于数字'9'?
jbe @@Convert_Bin 是,转去转换成二进制数
and al,0dfh 对高于数字'9'的字符视为字母并转换成大写,以便判断是否是A~F之间的字母
cmp al,'A' 低于字母'A'?
jb @@KBBack 是,重新输入
cmp al,'F' 高于字母'F'?
ja @@KBBack 高于字母'F',重新输入
sub al,7 使低4位等于对应字母的十六进制值
@@Convert_Bin: and al,0fh 转换成二进制数
push ax 入栈保存
loop @@Input_Hex 接受下一个数字
@@Return_Hex: mov ax,cx
mov cx,cs:@@Hexadec
sub cx,ax
jcxz @@Return_pop
std
@Reverse_Order:pop ax
stosb 保存
loop @Reverse_Order
@@Return_pop: pop ax
pop cx
pop di
pop es
ret
@@KB_Back: cmp cx,cs:@@Hexadec 十六进制数位数
jz @@Input_Hex
inc cx
dec di
dec Cursor_Col
@@KBBack: call SetCursor 置光标位置
jmp @@Input_Hex
@@Hexadec dw ? 数字位数
Input_Hex EndP
-------------------------------------
功能:将AL中的低4位二进制数转换成十六进制显示的ASCII码
入口:AL
出口:AL=转换后的ASCII码
AL_ASCII Proc Near
cmp al,10 AL<10?
jb @@To_ASCII AL<10,按数字处理
add al,7 AL>=10,按大写字母处理
@@To_ASCII: add al,'0' 转换成相应的数字或大写字母
ret
AL_ASCII EndP
-------------------------------------
功能:键盘输入一个字符,若输入的是'y'或'n'(不分大小写),则显示并返回
入口:无
出口:若输入的是'y',进位标志置位;若输入的是'n',进位标志复位。
Yes_or_No proc Near
push dx
push ax
@@Input_Chr: mov ah,7 不带回显的键盘输入
int 21h
mov dl,al
and al,0dfh
cmp al,'Y'
jnz $+5
stc
jmp $+7
cmp al,'N'
jnz @@Input_Chr
clc
mov ah,2
int 21h
pop ax
pop dx
ret
Yes_or_No Endp
-------------------------------------
N equ 10 数据位数
Summand db N dup(?) 被加数
Addend db N dup(?) 加数
Sum db N+1 dup(?) 和
Prompt_Str1 db 'Please input the summand:$' “输入被加数”提示信息
Prompt_Str2 db 13,10,'Please input the addend:$' “输入加数”提示信息
Prompt_Str3 db 13,10,'The sum:$' “显示相加之和”提示信息
Prompt_Str4 db 13,10,13,10,'Do you want to continue(y/n)?$' “继续做加法?”提示信息
Press_Key db7,13,10,13,10,'The complated. Press any key to exit...$'
-------------------------------------
Start: push cs
pop ds
push cs
pop es
mov @@Hexadec,10 数字位数
Addition_Hex: lea di,Sum 相加和存放地址
mov cx,N+1
xor al,al
cld
rep stosb 相加之和初始值清零
Output Prompt_Str1 提示输入被加数
lea di,Summand 被加数存放地址
call Input_Hex 键盘输入一个指定位数(N)的十六进制数字,保存在指定的存储单元
Output Prompt_Str2 提示输入加数
lea di,Addend 加数存放地址
call Input_Hex
mov si,9 个位数下标
lea di,Sum[10] 相加之和个位数存放地址
mov cx,10 数据位数
std
clc 进位标志位复位
Addition: mov al,Summand[si] 读入一位被加数
adc al,Addend[si] 加上加数
push cx
xor ah,ah
mov cx,4
shl ax,cl 左移4位,把进位标志位移到AH
shr al,cl 右移4位,把AL的低4位移回
pop cx
stosb 保存相加结果
rcr ah,1 带进位循环右移1位,把进位结果移至标志位
dec si
loop Addition
mov al,ah
rcl al,1 把进位标志移入AL
test al,al
jz $+3
stosb 保存最高位进位
Output Prompt_Str3 提示显示相加和
mov cx,N+1
lea di,Sum 相加和存放地址
xor al,al
cld
repz scasb 扫描相加和最高有效位
dec di
inc cx
mov si,di 相加和最高有效位地址
@@Output_Data: lodsb 读入1位相加和结果
call AL_ASCII 将AL中的低4位二进制数转换成十六进制显示的ASCII码
mov dl,al
call Output_Chr 显示一个字符
loop @@Output_Data
Output Prompt_Str4 提示是否继续做十六进制加法
call Yes_or_No 键盘输入一个字符,若输入的是'y'或'n'(不分大小写),则显示并返回
call Output_CTLF 显示、输出一个回车、换行
call Output_CTLF
jc Addition_Hex
-------------------------------------
Exit_Proc: Output Press_Key 提示 *** 作完成,按任意键结束程序
mov ah,1
int 21h
mov ah,4ch 结束程序
int 21h
Code ENDS
END Start 编译到此结束
1.设(DS)=2000H, (ES)=3000H, (SS)=4000H, (BX)=1000H, (BP)=1000H, (SI)=0001H, (DI)=0002H, (21000H)=1234H, (21002H)=5678H, (31000H)=9ABCH, (31002H)=0DEF0H, (41000H)=3456H, (41002H)=789AH, 计算下列各指令中源 *** 作数的物理地址,并指出指令执行后AX寄存器的内容。MOV AX, ES:[1000H]物理地址 31000H (AX)=9ABCH
MOV AX, [BX] 物理地址 21000H (AX)=1234H
MOV AX,[BP+DI] 物理地址 21002H (AX)=5678H
MOV AX, [BX][SI] 物理地址 21001H (AX)=7812H
6.在下列程序段括号中,填入正确的答案。
DATA SEGMENT
BUF DB 12H,56H
DATA ENDS
7.指出下列指令错误原因,填入括号中。
A. MOV AX,BL ;源 *** 作数与目标 *** 作数长度不同
B. MOV CS,AX ;CS寄存器不能作为目标 *** 作数
C. DEC GAMA[BX] ;必须显示指明目标 *** 作数的长度(使用BYTE PTR、WORD PTR等修饰符)
D. MOV ES,5600H ;以段寄存器作为MOV指令的目标 *** 作数时,源 *** 作数不能是立即数
E. SUB AX,DS ;段寄存器不可作为运算类指令的源 *** 作数
8.下列语句在存贮器中分别为变量分配多少字节?请填入括号中。
VR1 DW ? ;2字节
VR2 DW 4 DUP(?),2;10字节
CONT EQU 10 ;此为伪指令,CONT只是作为汇编阶段中表示数值10的标号,不是变量,因此不实际分配内存
9.设BX=1200H,SI=0002H,DS=3000H,(31200H)=50H,(31201H)=02H,(31202H)=OF7H,(31203H)=90H请写出下列各条指令单独执行后,有关寄存器及存储单元的内容,若该指令影响标志位,则指出其值。
A. DEC BYTE PTR〔1200H〕 ; 问:(31200)=4FH, CF=原来CF的值(DEC指令不影响CF标志)
B. SAR BYTE PTR [SI+1200H],1; 问:(31202H)=FBH,ZF=0
C. MOV AX,WORD PTR〔BX+SI〕;问:AX=90F7H,SF=原来SF的值(MOV指令不影响标志位)
2.每组写一条程序指令,使: (6分)
A. BX寄存器的低四位置1 OR BX,000FH 或者 OR BL,0FH
B. AX寄存器的低四位清0 AND AX,0FFF0H 或者 AND AL,0F0H
C. 用TEST指令测试DL寄存器的第3位和第6位是否同时为0。 TEST DL,01001000b(若结果ZF=0表示两者同时为0)
3.在某子程序的开始处要保护AX,BX,CX,DX四个寄存器信息,在子程序结束时要恢复这四个寄存器信息。例如: (4分)
保护现场
PUSH AX
PUSH BX
PUSH CX
PUSH DX
恢复现场
┇
┇
┇
试写出恢复现场时的指令序列。
POP DX
POP CX
POP BX
POP AX
1.对于下面的数据定义,各条MOV的指令单独执行后,有关寄存器的内容是什么?(5分)
FLDB DB ?
TAB1 DW 20 DUP(?)
TAB2 DB ‘ABCD’
(A) MOV AX,TYPE FLDBAX=1
(B) MOV AX,TYPE TAB1AX=2
(C) MOV CX,LENGTH TAB1 CX=20
(D) MOV DX,SIZE TAB1DX=40
(E) MOV CX,LENGTH TAB2 CX=1
下面程序段执行完后,AL的内容是什么? (5分)
MOV AL,10
ADD AL,AL
SHL AL,1
MOV BL,AL
SHL AL,1
ADD AL,BL
结果AL=0C0H
3试问下面的程序段完成的功能是什么? (5分)
SAL AX,1
RCL DX,1
5.已知程序段:
STRING DB ‘ABCDEFGHIJ’
┇
MOV AH,01 ;从键盘输入字符1~9
INT 21H
AND AL,0FH
DEC AL
XOR AH,AH
MOV BX,OFFSET STRING
ADD BX,AX
MOV DL,[BX]
MOV AH,02H ;显示输出
INT 21H
┇
试回答: (1)上述程序段的功能是什么?
(2)如从键盘输入字符‘4’,程序段有什么结果?(6分)
答:(1)上述程序段功能是从键盘输入一个字符,假定该字符是1-9,则输出STRING中这个数值所对应的字母(1对应A,2对应B……)
(2)输入4则输出D
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)