微机原理与接口技术 北邮 软件 实验报告

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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功能调用有了更深的认识和学习。同时,针对比较复杂的逻辑,需要将分支以及循环结构合理使用。在对不同情况加以考虑时,要注意对不同判决条件的选择,不同的代码指令可能可以实现相同的功能。实验的另一个收获是

相关文档
最新文档