题目名称:键盘输入两个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 编译到此结束
第一章6.PentiumIV /1.7G/80G/16XDVD/256M/19’’液晶/56KMODEM
WINDOS2000
第二章
1.(101010.01)2=(42.25)10 =(2A.4)BCD
2.(37.2)8=(31.25)10=(1F.4)(AC.E)
3..(AC.E)16=(172。875)10
4.(75。34)10=(1001011.0)2=(113.125)8=(8E.06)16
5.两种做法:1.先将十进制数转换成二进制数再计算
2.先计算,结果再转换成二进制数。结果为0.0001101
6.(1)原码为00000000补码为00000000
(2)原码为10000000补码为00000000
(3)原码为0.1010000补码为0.1010000
(4)原码为1.1010000补码为1.0110000
(5)原码为00001010补码为00001010
(6)原码为10001010补码为11110110
7.X原=0.1010 X=+0.1010
8.X原=1.0110 X=-0.0110
9.(1)0.000…01
(2)0.11…11
(3)1.00…01
(
4)1.11…11
10.(1)0.00….01
(2)0.11…11
(3)1.11…11
(4)1.00…01
11.参照教材37页的表格公式,注意阶码部分连同阶符的位数以及尾数连同符号的位数
12.参照教材37—38页,
13.使用隐地址
14.采用寄存器寻址
15.(1)1200H
(2)1002H
(3)1200H 1200H
(4)F03H
第三章
3.(1)正溢 01,100000
(2)无 00,111111
(3)无11,100000
(4)负溢 10,100000
4.[X]补—[Y]补=[X]补+[Y]补+1
无 00,000110
(1) 正溢01,100000
(2) 无 11,101111
(3) 无 00,110011
5. 11,00;11,110011
6.(1)0110101
(2)11000011
(3)01011010
7.(1)0011;1000
(2)0011;1001
(3)1010;0000
12.以下所有题的取指过程都是一样的
FT0 PC → MAR
FT1 M → MDR→IR ,PC+1→ PC
(2)FT0:PC→MAR
FT1:M → MDR →IR,PC+1 → PC
ST0:PC → MAR ,PC+1→ PC
ST1:M→ MDR → C
ET0:C → R1
(5)FT0:PC →MAR
FT1:M → MDR → IR,PC+1 → PC
ST0:PC → MAR
ST1:M →MDR → C,PC+1→ PC
DT0:R0→ MAR
ET0:C →MDR
ET1:MDR → M
其余小题参照97—101页的内容,寻址方式不同,各个执行周期也不相同。
13.(2)FT0:PC → MAR
FT1:M→ MDR → IR ,PC+1 → PC
ST0:PC → MAR
ST1:M→ MDR →C,PC+1 → PC
DT0:R1 → MAR
DT1:M→ MDR →D
DT2:R1+1 → Z
DT3:Z → R1
14.(3)FT0:PC →MAR
FT1:M → MDR → IR,PC+1 → PC
ET0:PC →MAR
ET1:M →MDR → D
ET2:D+PC → Z
ET3:Z →PC
第四章
3.该题进行计算时采用变形补码比较方便,可以顺便判断OF位。此题可以上机验证。
4.画图时存储器中地址从上到下是按由低向高排列
002B0H→53H
002B1H→2CH
002B2H→
002B3N→OEH
002B4H→1FH
7.(1)0007H
(2)3400H
8.0562H
9.物理地址1E2C:0062 SP的初始值为64H SP的初始值指向的物理地址是1E324H
10.(SP)=3CH
11.(SP)=5EH
13.(1)对(2)对(3)错 (4)对 (5)错 (6)对 (7)对 (8)错 (9)错
(10)错 (11)对 (12)对
分析错误的原因
14.CF=1 AF=1 ZF=0 SF=0 OF=0 (AL)=15H
15.(1)(CL)=(09226H)=F6H
(2)(1E4F6)=5678H
(3)(BX)=0056H、(AX)=1E40H
(4)(SI)=00F6H、(DS)=1E40H、(1E4F6)=0024H
(5)(0026H)=5678H、(CX)=00F6H、(09226H)=1234H、(AX)=5678H
6.MOV AX,[02C0]
MOV AX,0020H[SI]
MOV AX,[BP]
MOV AX,80H[DI][BX]
试试看,你还能写出几种。
17.(SI)=12484H、(AX)=6156H
18.(AX)=81C6H 、CF=1
19.(AX)=F8E0H、CF=1
20.(AX)=1236H、(BX)=0001H
21.(AX)=0001H
22.(BX)=0012H、ZF=0、CF=1
23.(AX)=FBABH
24.(AX)=0000H、CF=0
25.(AH)=0001H、(AL)=0101H 、CF=1
26.(SI)=0102H、(AL)=A5H
28.(1)program1:
LAFH
OR AH,80H
SAHF
Program2:
PUSHF
POP AX
AND AX,立即数
PUSH AX
POPF
(2)program1:
MOV CL,04H
ROL AL,CL
Program2:
MOV CL,04H
ROR AL,CL
(3)MOV SI,A
MOV BX,B
LEA AX[SI][BX]
(4)MOV CL,2
SHR AX,CL
MOV BX,DX
AND BX,0003H
MOV CL,OEH
SHL BX,CL
OR AX,BX
MOV CL,2
SHR DX,CL
(5)OR CX,0001
(6)XOR AX,OAH
(7)NOT AX
XOR BX,AX
第五章
1.(1)错(2)对(3)错(4)错(5)错(6)对(7)错(8)错
2.(1)(5)(6)(7)(8)(9)
3.(AL)=3, (Bx)=33H
4.(AX)=1234H, (BX)=34H
5.(SI)=7812H, (DS)=0CD56H
6.SI,S2的偏移量分别为30H,38H。CONT的值为8,S2+5字节单元的内容为43H
7.00H, FFFFH, FFH
8.0000H, 5550H
9.00AAH, FFFEH, FF54H用补码表示
10.前两问的答案
DX:008H,0007H,0006H, 0006H, 0005H, 0004H, 0000H共六个
AX:4567D, 456D, 45D,4D, 0000D, 注意进制
11.(AX)=56D4H, (BX)=ADA8H, CF=0
12.01H, D1H,C1H
13.‘A’‘B’‘C’‘D’‘E’‘F’‘G’‘H’‘I
14.0014H, 0007H
15.PUSH AX
POP DX
16.ORG 0020H
17.参照教材156页
18.第一个不同字符的位置,5。
19.地址由低到高依次为:00H,02H,04H,06H,08H。0AH,0CH,0EH ,10H…
20.(1)INC DX
(2)DEC DX
21.5, 24H
22.6, 1CH
23.0308H,0008H,000CH
24.(1)XOR AH,AL
(2)JE ZERO
25.ADD AH,1
ADC AX,1
31.(1)计算AL中的十进制数的二进制表示
(2)24H
32.(1)是0——9的数字或大写字母00——2F,
(2)输入为‘*’
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)