汇编语言程序设计题

汇编语言程序设计题,第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 编译到此结束

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


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存