JMP RB
RA: MOV AL,'N' ;不相等则将Y送AL RB:RET ;比较结束返回程序 L1 ENDP CODE ENDS END START
运行:当字符串为STRX DB 'CZX0','$' STRY DB 'CZX1','$'
当字符串为STRX DB 'CZX0','$' STRY DB 'CZX0','$'
4、实验中遇到的问题:
在刚开始接触实验时感觉非常困难,无从下手,后来经过仔细认真阅读书上的经典程序之后,基本能够写出关键程序片段,再借助辅导书完善了实验程序内容,基本顺利地完成了实验。
本次实验让我熟悉了汇编语言的实现步骤和常用的指令系统,同时也学会了利用DEBUG调试汇编程序。
实验二 汇编语言程序设计
1、实验目的
a) 练习编写较复杂汇编语言程序时程序框图的绘制。 b) 子程序定义与调用,参数传递的方法。
c) 了解宏指令的定义与调用,并与子程序定义与调用进行比较。 d) 掌握利用软件中断实现DOS系统调用的方法。 2、具体实验
第一题:
教材4章,第8题,设n=10。即试编制程序,找出前十个质数。 提示:编写一个判断某数是否质数的子程序,主程序调用该子程序,对顺序递增的自然数进行是否质数的判断,若是则存放在质数缓冲区中,直到找到10个质数,程序结束。
判断一个数N是否是质数的一种算法是:将N顺序与2~N-1的数相除,若每次除法的余数均不等于0,则该数是质数。
注意:8086的除法支持双字除以字,字除以字节,本题中可以选择字除以字节。
正确结果为:02,03,05,07,0B,0D,11,13,17,1D(十六进制数)
a) 实验原理
找出前十个质数,质数只能被1和其自身整除,但考虑到如果从2开始一个一个的除的算法效率太低,很多已经是合数的作为除数是浪费的,故该算法用每一个数除以已经判断出来的质数(均小于该数),如果不能整除则说明该数是质数,能整除说明该数不是质数,继续进行下一个判断。
b) 程序框图
c) 程序源代码 N EQU 10
STRDISP MACRO POS MOV DX,OFFSET POS MOV AH,9H INT 21H ENDM
NUMTOSTR MACRO NUM,POS MOV AX,NUM MOV SI,OFFSET POS ADD SI,LENGTH POS-2;从最后开始(不考虑字符串结束符\存放5个字符
CALL WORDTOSTR; ENDM
DATAS SEGMENT
NUMBER DW N DUP(0) LAST DW ?
NUMNOW DW ?
STR1 DB \,0DH,0AH,\ STR3 DB \,\ STRNO DB 6 DUP(\),\
STRPRIME DB 6 DUP(\),\ HCHH DB 0DH,0AH,\DATAS ENDS
STACKS SEGMENT STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS,ES:DATAS START:
MOV AX,DATAS MOV DS,AX MOV ES,AX
MOV AX,STACKS MOV SS,AX
MOV SI,OFFSET NUMBER;质数数组首地址 MOV BX,0
MOV NUMBER[SI+BX],2;第一个质数为2 MOV LAST,0;最后一个质数地址 MOV DX,2;第一个质数是2 MOV NUMNOW,1;质数计数 LOOP1:
INC DX;往后查找 MOV BX,2; MOV CX,0 LOOP2:
;判定DX中数据是否是质数
PUSH DX;保存现场,防止除法运算带来的改变 MOV AX,DX MOV DX,0
ADD SI,CX;求出作为除数的质数的相对位移
MOV BX,NUMBER[SI];从质数集里读取质数 ADC SI,CX;还原SI INC CX
INC CX;cx自加2
DIV BX;DX<-(DX:AX)/(BX)余数 CMP DX,0 POP DX
JZ LOOP1;除尽则表示该数不是质数,继续查找下一个 CMP BX,DX
JB LOOP2;如果除数小于被除数,则增大除数继续做除法 ADD LAST,2;相当于指针往后移动一个字的单位长度 MOV BX,LAST
MOV NUMBER[SI+BX],DX;将找到的质数存入数组,基址变址寻址 ADD NUMNOW,1;质数计数加1
CMP NUMNOW,N;得到N个质数则结束 JNZ LOOP1;否则继续查找
;输出结果
MOV NUMNOW,1
MOV DI,OFFSET NUMBER STRDISP STR1 DISPLAY:
NUMTOSTR NUMNOW,STRNO MOV AX,DS:[DI]
NUMTOSTR AX,STRPRIME STRDISP STRPRIME;输出质数 STRDISP HCHH INC DI INC DI
ADD NUMNOW,1 CMP NUMNOW,N JBE DISPLAY
;等待键盘输入,使程序不会立即退出 STRDISP STR3 MOV AH,08H INT 21H
MOV AH,4CH INT 21H ;子程序
;WORDTOSTR
;将AX中数字转换成5个字符的字符串,存入SI为首地址的存储单元里