汇编语言程序设计题

汇编语言程序设计题,第1张

本程序在MASMPlus 1.2集成环境下通过编译,经过调试,运行正确。虽不敢说万无一失,但自信无虞;请楼主严格测试,若还有误,本回答作废。

题目名称:键盘输入两个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)输入为‘*’


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7692895.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-08
下一篇 2023-04-08

发表评论

登录后才能评论

评论列表(0条)

保存