2_字符及字符串输入输出与顺序程序
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
实验
2.2字符及字符串输入输出与顺序程序设计实验
班级:软件1101
学号:04113033
姓名:岳彦利
1. 实验目的
1、学习和掌握字符及字符串的输入输出方法。
2、掌握顺序程序的设计方法。
3、进一步掌握调试工具的使用方法。
2. 实验预习要求
1、复习DOS功能调用中用于字符输入(功能号01H)、字符输出(功能号02H)、字符串输入(功能号
为0AH)以及字符串输出(功能号09H)的调用方法(详见教材5.5.6)。
2、复习BCD码运算调整指令。
3、根据“2.2.3 实验
内容
财务内部控制制度的内容财务内部控制制度的内容人员招聘与配置的内容项目成本控制的内容消防安全演练内容
”中给出的源程序框架编写完整的源程序,以便实验时调试。 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的ASCII码)和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
(2)非压缩型BCD数加法调整指令的使用
设从键盘输入的数值已存放在寄存器AL, BL中,可用下列程序完成数据相加和调整操作:
XOR AH,AH
ADD AL, BL
AAA ;执行该指令后,AH中为和的十位上的数字,AL中为个位上的数字
请读者考虑,为什么要使用指令“XOR AH,AH”,不用行否,
(3)计算结果的显示
执行完AAA指令后,只需分别将AH(十位上的数值)和AL(个位上的数值)加上30H,并依次调用功能号为2的DOS功能调用来显示字符。
2、 程序调试
源程序编写完成后,先静态检查,无误后,对源程序进行汇编和连接,生成可执行文件。在DOS
命令提示符下运行该程序,分析运行结果是否正确。若结果不正确,使用DEBUG对其进行调试。
4.我的程序:
datasegment
infor1 db "please input the first data(<10):$"
infor2 db 0ah,0dh,"please input the second data(<10):$"
infor3 db 0ah,0dh,"the result is:$";
dataends
codesegment
assume cs:code,ds:data start: mov ax,data
mov ds,ax
;显示提示信息1
mov dx,offset infor1
mov ah,09h
int 21h
;从键盘输入一个数字
mov ah,01h
int 21h
sub al,30h
;将第一个数字放进bl里边
mov bl,al
;显示提示信息2并且输入第二个数字放入al里边
mov dx,offset infor2
mov ah,09h
int 21h
mov ah,01h
int 21h
sub al,30h
;两个数字相加结果放入ax里边
xor ah,ah
add al,bl
aaa
push ax
;第三个提示信息输出
mov dx,offset infor3
mov ah,09h
int 21h
pop ax
push ax
mov dl,ah
add dl,30h
mov ah,02h
;cmp ah,'0'
;jbe other
;jmp low
int 21h
pop ax
mov dl,al
add dl,30h
mov ah,02h
int 21h
mov ah,4ch
int 21h
code ends
end start
5.我选做的题:
设a,b,c,d为四个压缩型BCD数,它们被存放在内存dbcd开始的4个存储单元中,计算a+b+c+d,并将
结果在屏幕上显示出来(注意压缩型BCD数的表示方法:十进制数38表示成压缩型BCD数时应写成38H)。
程序编写完成并运行正确后,打开源程序,改变a,b,c,d的内容,然后重新进行汇编、连接并运行程序,
检查程序运行结果与手工计算结果是否相符。下面给出几组实验用数据:
(1) 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)
我的程序:
DATAS SEGMENT
tem db 10
db ?
db 10 dup(0)
tem1 db 0ah,0dh ;用来存放加完的和
db 3 dup(0)
db '$'
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
mov dx,offset tem;变量地址放入dx
mov ah,0ah;输入那四个两位的数字
int 21h
mov bx,offset tem;变量地址放入bx
mov dx,0;清零
xor ax,ax;清零
mov cx,4
mov si,3
loo1:;loo1用来相加全部数的个位数字
mov dl,[bx+si]
sub dl,30h
add al,dl
aaa
add si,2
loop loo1
lea bx,tem1;加完,放入tem1也就是和里
add [bx+4],al;放入个位
add [bx+3],ah;放入十位,因为可能进位
mov bx,offset tem
mov dx,0;清零
xor ax,ax;清零
mov cx,4
mov si,2
loo2:;loo1用来相加全部数的十位数字
mov dl,[bx+si]
sub dl,30h
add al,dl
aaa
add si,2
loop loo2
lea bx,tem1;加完,放入tem1也就是和里
add [bx+3],al;放入十位
add [bx+2],ah;放入百位,因为可能进位
mov ah,30h
add [bx+2],ah;加30h变成ascll码
add [bx+3],ah
add [bx+4],ah
lea dx,tem1;和的地址放入dx用于调用9号功能
mov ah,09h
int 21h
MOV AH,4CH
INT 21H
CODES ENDS
END START
6.
进行实验时候,我把两个数都放到al中然后进行想加,结果总是第二个数的整数倍,然后检查
没有发现问题。在经过老师的分析指导后才发现问题所在,然后进行改正,答案正确。所以在下次实验
室一丁丁要注意数字的存放位置。