《微机原理与接口技术》上一些8086汇编程序

题目来源:《微机原理与接口技术》第五版,周荷琴,中国科学技术大学出版社 第四章课后第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

使用-t命令单步执行到输入字符串的位置后再使用-g命令直接运行完毕到显示

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

-G后-D
如图所示,-D可知,0000到0003存储加数9876H,0004到0007存储被加数6543H,0008到000B内是结果FD89H。

猜你喜欢

转载自blog.csdn.net/Tele_Anti_Nomy/article/details/72376909