题目来源:《微机原理与接口技术》第五版,周荷琴,中国科学技术大学出版社 第四章课后第10、11、12、13、17题
编程环境:DOSBOX 0.74 / masm611
博客编辑:Markdown (首次尝试) (~ ̄▽ ̄)~
10.编写汇编语言程序,完成如下功能:
(1) 从键盘输入一个字符串“Please input a number: ”,存入BUFF开始的内存单元。
(2) 把内容中从BUFF单元开始存放的字符串显示在屏幕上。
使用MOV对缓冲区偏移量配合INT 21的系统功能调用即可将字符串存入内存;
显示字符串时有两种方案:一种是在输入字符串时在最后加“$”符号,在打印时会将它作为结束标志,相当于C语言字符串操作中‘\0’的作用;另一种方案是在存字符串入内存时同时把输入的字符的数量存进去,显示的时候把这个数字作为循环次数一个一个把字符显示出来。
;第一种方案
MYSTACK SEGMENT STACK
DW 64 DUP(?)
MYSTACK ENDS
DATA SEGMENT
BUFF DB 50
DB ?
DB 50 DUP(?)
DATA ENDS
ASSUME CS:CODE,SS:MYSTACK,CS:DATA
CODE SEGMENT
START: MOV AX, DATA
MOV DS, AX
MOV DX, OFFSET BUFF ;向缓冲区写字符串
MOV AH, 0AH
INT 21H
MOV SI, OFFSET BUFF ;读出缓冲区偏移地址
INC SI
MOV AH, 00H
MOV AL, [SI] ;输入字符数存入AL
INC AL
INC AL
MOV SI, AX
MOV DS:[SI], '$' ;在字符串末存入'$'
MOV DX, OFFSET BUFF
INC DX
INC DX
MOV AH,9
INT 21H
INT 3H
MOV AX,4C00H
INT 21H
CODE ENDS
END START
;第二种方案
MYSTACK SEGMENT STACK
DW 64 DUP(?)
MYSTACK ENDS
DATA SEGMENT
BUFF DB 50
DB ?
DB 50 DUP(?)
DATA ENDS
ASSUME CS:CODE,SS:MYSTACK,CS:DATA
CODE SEGMENT
START: MOV AX, DATA
MOV DS, AX
MOV DX, OFFSET BUFF ;向缓冲区写字符串
MOV AH, 0AH
INT 21H
MOV SI, OFFSET BUFF ;读出缓冲区偏移地址
MOV CH, 00H
INC SI
MOV CL, [SI]
DIS: INC SI ;逐个循环显示字符串内容
MOV DL, [SI]
MOV AH, 02H
INT 21H
LOOP DIS
INT 3H
MOV AX, 4C00H
INT 21H
CODE ENDS
END START
11.编程实现:在显示器上显示全部标准和扩展ASCII码(其编码为00~FF)字符。
设定一个寄存器的值从00到FF循环,再依次显示出来即可。
MYSTACK SEGMENT STACK
DW 64 DUP(?)
MYSTACK ENDS
DATA SEGMENT
DW ?
DATA ENDS
ASSUME DS:DATA,CS:CODE,SS:MYSTACK
CODE SEGMENT
START: MOV AX, DATA
MOV DS, AX
MOV CX, 0100H ;设定循环次数
MOV DH, 00 ;设定起始显示字符对应ASCII码
DIS: MOV DL, 00 ;每次显示ASC前先显示一个空格
MOV AH, 02H
INT 21H
MOV DL, DH
MOV AH, 02H
INT 21H
INC DH
LOOP DIS
INT 3
CODE ENDS
END START
12.编程实现:从键盘输入一个10进制数字0~9,查表求键入数字的七段代码,存入DL中,并在键入数字之前,显示提示信息“Please input a number:”。
MYSTACK SEGMENT STACK
DW 64 DUP(?)
MYSTACK ENDS
DATA SEGMENT
TABLE DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
BUF DB ‘Please input a number(0~9):’,0DH,0AH,‘$’
DATA ENDS
ASSUME DS:DATA,CS:CODE,SS:MYSTACK
CODE SEGMENT
START: MOV AX, DATA
MOV DS, AX
MOV DX, OFFSET BUF
MOV AH, 09H
INT 21H ;显示提示信息
MOV AH, 01H
INT 21H
MOV DL, AL ;由功能调用读入字符并存入DL
AND DL, 0FH ;保证0~9
MOV BX, OFFSET TABLE ;BX指向表头地址
MOV DH, 0 ;除最后一位均清零
ADD BX, DX
MOV DL, [BX] ;查表得平方值
INT 3
MOV AX, 4C00H
INT 21H
CODE ENDS
END START
更改部分代码,使程序可以循环输入,观察DL,实现了题目要求
13.某个学生的英语成绩已存放在BL中,如果低于60分,则显示F(Fail),如果高于或等于85分,则显示G(Good),否则显示Pass(Pass),试编写完整的汇编语言程序来实现。
对预存好的成绩从小到大依次判断,即先判断和60分比较的大小,再判断和85分比较的大小,这之间用好条件跳转的命令即可。
这里做一点小修改,我们将成绩利用功能调用输入到BL再判断。
MYSTACK SEGMENT STACK
DW 64 DUP(?)
MYSTACK ENDS
DATA SEGMENT
DW ?
DATA ENDS
ASSUME CS:CODE,SS:MYSTACK,CS:DATA
CODE SEGMENT
START: MOV AX, DATA
MOV DS, AX ;数据段就位
MOV BL, 80 ;成绩存放在BL中
CMP BL, 60
JB FAIL ;低于60分,跳转到FAIL
CMP BL, 85
JAE GOOD ;不低于85分,跳转到GOOD
MOV AL, 'P'
JMP PRINT
FAIL: MOV AL, 'F'
JMP PRINT
GOOD: MOV AL, 'G'
PRINT: MOV DL, AL
MOV AH, 02H
INT 21H
INT 3H
MOV AX, 4C00H
INT 21H
CODE ENDS
END START
通过在源代码中修改BL的值得到三种结果。
17.已知数A=9876,数B=6543,编程求两数之和。
分别将A和B以字的长度存储在数据段开头,在assume各段之后就可以直接相加,结果存储在数据段中位于它们之后的位置,可用-D查看。
MYSTACK SEGMENT STACK
DW 64 DUP(?)
MYSTACK ENDS
DATA SEGMENT
XD DW 9876H
YD DW 6543H
ZD DW ?
DATA ENDS
ASSUME DS:DATA,CS:CODE,SS:MYSTACK
CODE SEGMENT
START: MOV AX, DATA
MOV DS, AX
MOV AX, XD
ADD AX, YD
MOV ZD, AX ;结果存储到ZD中
INT 3
CODE ENDS
END START
如图所示,-D可知,0000到0003存储加数9876H,0004到0007存储被加数6543H,0008到000B内是结果FD89H。