微机原理与接口技术 北邮 软件 实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
微机原理与接口技术软件实验报告
实验B 分支、循环程序设计
一、实验目的
1.开始独立进行汇编语言程序设计;
2.掌握基本分支,循环程序设计;
3.掌握最简单的DOS功能调用。
二、实验任务及内容
1.安排一个数据区,内存有若干个正数,负数和零。每类数的个数都不超过9。
2.编写一个程序统计数据区中正数,负数和零的个数。
3.将统计结果在屏幕上显示。
4. 选作题:
统计出正奇数,正偶数,负奇数,负偶数以及零的个数.
四、源程序
DISPSTR MACRO STR ;打出字符串(属于DOS功能调用)MOV AH,9
MOV DX,SEG STR
MOV DS,DX
MOV DX,OFFSET STR
INT 21H
ENDM
DISPNUM MACRO NUM ;打出数字(属于DOS功能调用)MOV AH,2
MOV DL,NUM
ADD DL,30H ;加30H变为ASCII码
INT 21H
ENDM
DATA SEGMENT
NUM DB 3,2,7,0,1,0,-5,-4,0
COUNT EQU $-NUM ;统计数据个数
ZEROS DB 0 ;各类数初值均为0
PLUSES DB 0
MINUSES DB 0
EVENMINUSES DB 0
ODDMINUSES DB 0
EVENPLUSES DB 0
ODDPLUSES DB 0
ZEROSTR DB 0DH,0AH,'ZERO:$' ;待输出字符串
PLUSSTR DB 0DH,0AH,'PLUS:$'
MINUSSTR DB 0DH,0AH,'MINUS:$'
EVENMINUSSTR DB 0DH,0AH,'EVENMINUS:$'
ODDMINUSSTR DB 0DH,0AH,'ODDMINUS:$'
EVENPLUSSTR DB 0DH,0AH,'EVENPLUS:$'
ODDPLUSSTR DB 0DH,0AH,'ODDPLUS:$'
DATA ENDS
STACK SEGMENT STACK 'STACK'
DB 100 DUP(?)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA, SS:STACK
START PROC FAR
PUSH DS ;初始化
MOV AX,0
PUSH AX
MOV AX,DATA
MOV DS,AX
MOV CX,COUNT ;CX控制循环次数
MOV SI,OFFSET NUM ;SI指向数据的偏移地址
LOOP1: CMP BYTE PTR[SI],0 ;将SI指向的内容与0比较大小JZ ZERO ;等于0跳转
JG PLUS ;大于0跳转
INC MINUSES ;负数加一
SHR BYTE PTR[SI],1 ;判断是负奇数还是负偶数
JNC EVENMINUS ;是负偶数跳转
INC SI ;SI指针后移
INC ODDMINUSES ;负奇数加一
RETURN: LOOP LOOP1 ;循环直至CX=0
JMP DISP ;循环结束后跳转至打出结果
ZERO: INC ZEROS
INC SI
JMP RETURN ;返回循环体
PLUS: INC PLUSES
SHR BYTE PTR[SI],1
JNC EVENPLUS
INC SI
INC ODDPLUSES
JMP RETURN
EVENPLUS: INC SI
INC EVENPLUSES
JMP RETURN
EVENMINUS: INC SI
INC EVENMINUSES
JMP RETURN
DISP: DISPSTR ZEROSTR ;打出结果
DISPNUM ZEROS
DISPSTR PLUSSTR
DISPNUM PLUSES
DISPSTR MINUSSTR
DISPNUM MINUSES
DISPSTR EVENPLUSSTR
DISPNUM EVENPLUSES
DISPSTR ODDPLUSSTR
DISPNUM ODDPLUSES
DISPSTR EVENMINUSSTR
DISPNUM EVENMINUSES
DISPSTR ODDMINUSSTR
DISPNUM ODDMINUSES
RET
START ENDP
CODE ENDS
END START
end start
五、程序运行结果
进行统计的数据为3,2,7,0,1,0,-5,-4,0。程序运行结果如下:
六、回答预习题
1.十进制数0 --9所对应的ASCII码是什么?如何将十进制数0--9在屏幕上显示出来?
0--9的ASCII码为30H—39H。若想将一个十进制数0—9的字符在屏幕上显示出来,首先应该把它所占寄存器的值赋给DL寄存器,然后DL寄存器的值加30H,然后执行02号DOS 功能调用,即执行以下代码“MOV AH,02”,“INT 21H”即可。
2.如何检验一个数为正,为负或为零?你能举出多少种不同的方法?
1)可以用CMP指令将数与0比较,若为正数则可通过JG跳转;若为0可通过JE/JZ
跳转;若为负数可通过JL跳转。
2)若只需判断是非负数或者负数,则可以用TEST指令将数与80H(DB情况下)或8000H
(DW情况下)相与,若为非负数则可通过JE/JZ跳转;若为负数则可通过JNE/JNZ 跳转。
3)若只需判断是非负数或者负数,则也可以用SHL,SAL对数字进行左移,若为非负
数可根据JNC判断;若为负数可以根据JC判断跳转。
4)若只需判断是非负数或者负数,则也可以用JS,JNS来进行判断,若为非负数可根
据JNS跳转;若为负数可以根据JS判断跳转。
七、实验总结、建议要求、心得体会
通过本次实验,我对宏定义和调用以及DOS功能调用有了更深的认识和学习。同时,针对比较复杂的逻辑,需要将分支以及循环结构合理使用。在对不同情况加以考虑时,要注意对不同判决条件的选择,不同的代码指令可能可以实现相同的功能。实验的另一个收获是