学堂 学堂 学堂公众号手机端

实验2 字符及字符串输入输出与顺序程序设计实验【微机原理】【实验】

lewis 1年前 (2024-05-01) 阅读数 16 #技术


2.2字符及字符串输入输出与顺序程序设计实验​​头脑风暴​​​​推荐​​​​2.2字符及字符串输入输出与顺序程序设计实验​​​​2.2.1实验目的​​​​2.2.2实验预习要求​​​​2.2.3实验内容​​​​2.2.4实验习题​​​​2.2.5实验报告要求​​​​头脑风暴答案​​头脑风暴

​​拯救地球精英【逻辑题】​​

推荐

​​算术运算指令【微机原理】​​​​位操作指令【微机原理】​​​​串操作指令【操作系统】​​​​DOS系统功能调用表(INT 21H)​​


2.2字符及字符串输入输出与顺序程序设计实验2.2.1实验目的

1、学习和掌握字符及字符串的输入输出方法
2、掌握顺序程序的设计方法。
3、进一步掌握调试工具的使用方法。

2.2.2实验预习要求

1、复习DOS功能调用中用于字符输入(功能号01H)、字符输出(功能号02H)、字符串输入(功能号为0AH 以及字符串输出(功能号09H)的调用方法(详见教材5.4.1)。
2、复习BCD码运算调整指令。
3、根据“2.23实验内容”中给出的源程序框架编写完整的源程序,以便实验时调试。
4、从“2.24实验习题”中任选一道题目,编写源程序,以便上机调试。

2.2.3实验内容

从键盘输入两个一位十进制数,计算这两个数之和,并将结果在屏幕上显示出来。
1、问题分析
比如使用功能号为01H的用于实现单个字符输入的DOS功能调用接收从键盘输入的两个十进制数8和6, 这时计算机内部得到的是这两个数的ASCII码值38H和36H。由于数字0~9的ASCII码值与其代表的数值之间 相差30H,因此将其减去30H即可得到以非压缩型BCD数形式表示的十进制数08H和06H,使用ADD指令 对它们进行相加后结果为0EH(00001110B),显然需要用非压缩型BCD数加法调整指令对ADD的运算结果进行调整,调整后得到两个非压缩型BCD数01H和04H,将它们分别加上30H后变为其对应的ASCII码31H(1 的ASCI码)和34H(4的ASCII码),然后调用功能号为02H用于单个字符输出的DOS功能调用将它们显示出来。综上所述,需要考虑以下问题。
(1)从健盘输入一个一位十进制数的方法
通过功能号为1的DOS功能调用实现从键盘输入一个字符,格式如下:

MOV  AH,01H
INT 21H ;此时程序等待用户键入,键入字符的ASCII码值存在AL中
SUB AL,30H;减去30H后得到键入数字所代表的数值

(2)提示信息字符中的显示
通过功能号为9的DOS功能调用实现字符小显示,注意字符中的最后一个字符必需为$’。指令格式如下:

MOV DX,OFFSET INFOR1;INFOR1为在数据段中定义的要显示的字符小
MOV AH,09H
INT 21H

(3)非压缩型BCD数加法调整指令的使用
设从键盘输入的数值已存放在寄存器AL,BL中,可用下列程序完成数据相加和调整操作:

XOR AH,AH
ADD AL,BL
AAA
;执行该指令后,AH中为和的十位上的数字,AL中为个位上的数字

请读者考虑,为什么要使用指令“XOR AH,AH”,能否不用?
不能
AAA指令后面不写操作数,但实际上隐含累加器操作数AL,AH。指令的操作为

如果  (AL)^0fH>9,或(AF)=1
则 (AL)<-(AL)+06H
(AH)<-(AH)+1
(AF)<-=1
(CF)<-(AF)
(AL)<-((AL)^0fH)
否则 (AL)<-((AL)^0fH)

(4)计算结果的显示
执行完AAA指令后,只需分别将AH(十位上的数值)和AL(个位上的数值)加上30H,并依次调用功能号为2的DOS功能调用来显示字符。具体指令代码如下:

PUSH AX
MOV DL,AH
ADD DL, 30H
MOV AH,02H
INT 21H
POP AX
MOV DL,AL
ADD DL,30H
MOV AH,02H
INT 21H

2、源程序框架

DATA SEGMENT
INFOR1 DB "Please Input the First Data(<10):$"
INFOR2 DB 0AH,0DH,"Please Input the Second Data(<10):$"
INFOR3 DB 0AH,0DH,"The Resultis:$"
;0DH和0AH分别为非显示字符回车和换行的ASCI码值,
;美圆符号“S”为字符串结束标志,不能省略。
DATA ENDS
CODE SEGMENT
ASSUME CS: CODE, DS:DATA
START:
MOV AX,DATA
MOV DS,AX
;显示提示信息INFOR1并从键盘接收一个字符的指令序列
SUB AL, 30H
MOV BL,AL
;显示提示信息INFOR2并从键盘接收一个字符的指令序列
SUB AL,30H
;求和并调整指令序列
PUSH AX
;显示提示信息INFOR3的指令序列
POP AX
;显示十位及个位上数字的指令序列
PUSH AX
MOV AH,4CH
INT 21H
CODE ENDS
END START

3、程序调试
源程序编写完成后,先静态检查,无误后,对源程序进行汇编和连接,生成可执行文件。在DOS命令提示符下运行该程序,分析运行结果是否正确。若结果不正确,使用DEBUG对其进行调试。

2.2.4实验习题

1、设ab.cd为四个压缩型BCD数,它们被存放在内存abcd开始的4个存储单元中,计算a+b+c+d,并将结果 在屏幕上显示出来。程序编写完成并运行正确后,打开源程序,改变a,b,c,d的内容,然后重新进行汇编、 连接并运行程序,检查程序运行结果与手工计算结果是否相符。下面给出几组实验用数据:
(l) a=11,b=23.c=25.d=31
(2)a=10,b-20,c=30,d-40
(3)a-45.b-45.c-45.c-45
(4) a-88.b-99.c=77.d-66
(注意压缩型BCD数的表示方法:十进制数38表示成压缩型BCD数时应写成38H)
2、从键盘输入两个一位十进制数,计算这两个数之积,并将结果在屏幕上显示出来。
3、从键盘输入0~9中任意一个数自然数,将其立方值在屏幕上显示(使用查表法实现)出来。

2.2.5实验报告要求

1、补全“2.2.3实验内容”中源程序框架内未写出的程序代码,并说明在调试该程序过程中遇到了哪些问题, 是如何处理的。
把问题分析的代码粘入即可
0.asm

DATA SEGMENT
INFOR1 DB "Please Input the First Data(<10):$"
INFOR2 DB 0AH,0DH,"Please Input the Second Data(<10):$"
INFOR3 DB 0AH,0DH,"The Resultis:$"
;0DH和0AH分别为非显示字符回车和换行的ASCI码值,
;美圆符号“S”为字符串结束标志,不能省略。
DATA ENDS
CODE SEGMENT
ASSUME CS: CODE, DS:DATA
START:
MOV AX,DATA
MOV DS,AX
;显示提示信息INFOR1并从键盘接收一个字符的指令序列

MOV DX,OFFSET INFOR1;INFOR1为在数据段中定义的要显示的字符小
MOV AH,09H
INT 21H

MOV AH,01H
INT 21H
;此时程序等待用户键入,键入字符的ASCII码值存在AL中


SUB AL, 30H;减去30H后得到键入数字所代表的数值
MOV BL,AL
;显示提示信息INFOR2并从键盘接收一个字符的指令序列

MOV DX, OFFSET INFOR2
MOV AH,09H
INT 21H

MOV AH,01H
INT 21H ;此时程序等待用户键入,键入字符的ASCII码值存在AL中

SUB AL,30H
;求和并调整指令序列

XOR AH,AH
ADD AL,BL
AAA


PUSH AX
;显示提示信息INFOR3的指令序列

MOV DX, OFFSET INFOR3
MOV AH,09H
INT 21H

POP AX
;显示十位及个位上数字的指令序列
PUSH AX
MOV DL,AH
ADD DL, 30H
MOV AH,02H
INT 21H
POP AX
MOV DL,AL
ADD DL,30H
MOV AH,02H
INT 21H

PUSH AX
MOV AH,4CH
INT 21H
CODE ENDS
END START

2、从“2.2.4实验习题”中任选一道题目,画出流程图,编写源程序,并说明在调试过程中遇到了哪些问题, 是如何处理的。
2、1、设abcd为四个压缩型BCD数,它们被存放在内存abcd开始的4个存储单元中,计算a+b+c+d,并将结果在屏幕上显示出来。程序编写完成并运行正确后,打开源程序,改变a,b,c,d的内容,然后重新进行汇编、 连接并运行程序,检查程序运行结果与手工计算结果是否相符。下面给出几组实验用数据:
(l) a=11,b=23,c=25,d=31;090
(2)a=10,b=20,c=30,d=40;100
(3)a=45.b=45.c=45.c=45;180
(4) a=88.b=99.c=77.d=66;330
(注意压缩型BCD数的表示方法:十进制数38表示成压缩型BCD数时应写成38H)

思路

结果是3位存储到AX中0XYZ

ADD AL,NN 有进位
就给AH加1

显示数字
X是百位数字
Y是十位数字
Z是个位数字
从AH中取出X
从AL中取出Y和Z
AL右移4位即为Y
AL与0FH即为Z

1.asm

DATA SEGMENT
;ABCD DB 31H,25H,23H,11H;090
;ABCD DB 40H,30H,20H,10H;100
;ABCD DB 45H,45H,45H,45H;180
ABCD DB 66H,77H,99H,88H;330
INFOR DB "The Resultis:$"

DATA ENDS
CODE SEGMENT

ASSUME CS:CODE,DS:DATA
START:

MOV AX,DATA
MOV DS,AX

MOV AH,0;用来存储百位数字
MOV CX,4
MOV BX,0
MOV AL,0


A: ADD AL,[BX];用来存储十位个位数字
DAA
INC BX
JC S
LOOP A;把CX-1,如果CX!=0,跳转到A


JNC B ;USE S TO JMP->B
S:
INC AH
OR AH,AH ;不改变AH,只清空CF=0
LOOP A

B:
PUSH AX
;显示提示信息INFOR的指令序列
MOV DX, OFFSET INFOR
MOV AH,09H
INT 21H
POP AX


PUSH AX
ADD AH,30H
MOV DL,AH;显示百位数字
MOV AH,2
INT 21H

POP AX
PUSH AX
MOV CL,4
SAR AL,CL

AND AL,0FH
ADD AL,30H
MOV DL,AL;显示十位数字
MOV AH,2
INT 21H

POP AX

AND AL,0FH
ADD AL,30H
MOV DL,AL;显示个位数字
MOV AH,2
INT 21H


MOV AH,4CH
INT 21H

CODE ENDS
END START

结果



2、2、从键盘输入两个一位十进制数,计算这两个数之积,并将结果在屏幕上显示出来。
只需对0.asm修改两行代码

  ;求和并调整指令序列
;ADD AL,BL
;AAA
求积并调整指令序列
MUL BL
AAM

2.asm

DATA SEGMENT
INFOR1 DB "Please Input the First Data(<10):$"
INFOR2 DB 0AH,0DH,"Please Input the Second Data(<10):$"
INFOR3 DB 0AH,0DH,"The Resultis:$"
;0DH和0AH分别为非显示字符回车和换行的ASCI码值,
;美圆符号“S”为字符串结束标志,不能省略。
DATA ENDS
CODE SEGMENT
ASSUME CS: CODE, DS:DATA
START:
MOV AX,DATA
MOV DS,AX
;显示提示信息INFOR1并从键盘接收一个字符的指令序列

MOV DX,OFFSET INFOR1;INFOR1为在数据段中定义的要显示的字符小
MOV AH,09H
INT 21H

MOV AH,01H
INT 21H
;此时程序等待用户键入,键入字符的ASCII码值存在AL中


SUB AL, 30H;减去30H后得到键入数字所代表的数值
MOV BL,AL
;显示提示信息INFOR2并从键盘接收一个字符的指令序列

MOV DX, OFFSET INFOR2
MOV AH,09H
INT 21H

MOV AH,01H
INT 21H ;此时程序等待用户键入,键入字符的ASCII码值存在AL中

SUB AL,30H
;求积并调整指令序列

XOR AH,AH
;ADD AL,BL
;AAA
MUL BL
AAM


PUSH AX
;显示提示信息INFOR3的指令序列

MOV DX, OFFSET INFOR3;
MOV AH,09H
INT 21H

POP AX
;显示十位及个位上数字的指令序列
PUSH AX
MOV DL,AH
ADD DL, 30H
MOV AH,02H
INT 21H
POP AX
MOV DL,AL
ADD DL,30H
MOV AH,02H
INT 21H

PUSH AX
MOV AH,4CH
INT 21H
CODE ENDS
END START

结果


2、3、从键盘输入0~9中任意一个数自然数,将其立方值在屏幕上显示(使用查表法实现)出来。

思路

把结果放入两个表中
RES1,放高2位,即0X
RES2,放低2位,即YZ
查表得出的结构0XYZ存储到AX中
显示代码和1.asm代码一样

3.asm

DATA SEGMENT
RES1 DB 0H,0H,0H, 0H, 0H, 1H, 2H, 2H, 5H, 7H ;存储结果的百位数字
RES2 DB 0H,1H,8H,27H,64H,25H,16H,43H,12H,29H ;存储结果的十位个位数字
INFOR1 DB "Please Input the Data(<10):$"
INFOR2 DB 0AH,0DH,"The Resultis:$"

DATA ENDS
CODE SEGMENT
ASSUME CS: CODE, DS:DATA
START:
MOV AX,DATA
MOV DS,AX
;显示提示信息INFOR1并从键盘接收一个字符的指令序列

MOV DX,OFFSET INFOR1;INFOR1为在数据段中定义的要显示的字符小
MOV AH,09H
INT 21H

MOV AH,01H
INT 21H
;此时程序等待用户键入,键入字符的ASCII码值存在AL中


SUB AL, 30H;减去30H后得到键入数字所代表的数值
MOV DL,AL
LEA BX,RES1
XLAT RES1
MOV AH,AL ;AX百位数字

MOV AL,DL
LEA BX,RES2
XLAT RES2 ;AL十位个位数字

PUSH AX

;显示提示信息INFOR2的指令序列

MOV DX, OFFSET INFOR2
MOV AH,09H
INT 21H

POP AX

PUSH AX
ADD AH,30H
MOV DL,AH;显示百位数字
MOV AH,2
INT 21H

POP AX
PUSH AX
MOV CL,4
SAR AL,CL

AND AL,0FH
ADD AL,30H
MOV DL,AL;显示十位数字
MOV AH,2
INT 21H

POP AX

AND AL,0FH
ADD AL,30H
MOV DL,AL;显示个位数字
MOV AH,2
INT 21H

PUSH AX
MOV AH,4CH
INT 21H
CODE ENDS
END START

结果


3、写出实验小结,内容包括实验心得(收获)、不足之处或今后应注意的问题等。

头脑风暴答案

​​拯救地球精英答案【逻辑题】​​



版权声明

本文仅代表作者观点,不代表博信信息网立场。

热门