2、利用文本编辑程序,建立源文件。
3、利用汇编程序MASM对源程序汇编,形成目标文件 4、利用LINK对目标文件进行链接,形成可执行文件。 5、键入程序 ,调试运行 , 若未出现预期结果 ,用 DEBUG 检查有否错误 。
【思考题】
1、编写一个数据搜索程序
首先在字节型变量X数据组中依次存放04H、08H、1CH、2DH、33H、54H、 87H、53H、98H、0A8这10个数据,然后通过运行所编写的程序在这个数组中寻找54H这个数据,如果找到则在屏幕上显示这个数据,否则显示“NO FIND!”这个信息。将寻找的内容改为97H重新运行查看结果
2、设有N个数,连续存放在以BUF为首址的字存储区中。试编写程序。统计其中最高6位为全1的数的个数,并将统计结果送入屏幕显示。
【实验报告要求】
1、记录实验步骤和出现的现象,按照要求写出显示结果,源程序加上注释。 2、比较实验记录和理论分析的结果是否相同,如果不同找出差别并分析原因。 3、写实验报告,画出算法流程图,运行可执行文件并写出运行结果。 4、回答思考题问题,总结本次实验体会。
实验八 多重循环程序设计 (2学时)
【实验目的】
1.掌握多重循环程序设计的方法 2.掌握正确分配与使用寄存器。 3.掌握控制循环的方法。
【实验内容】
1、设有N个数,连续存放在以BUF1和BUF2为首地址中,编写程序实现将既在BUF1存储区中又在BUF2存储区中的数据存入BUF3为首址中,并将BUF3为首址的内容显示出来。(P147)
DATAS SEGMENT
out1 db 10 dup(0)
BUF1 DW 100H,200H,300H,400H,500H,600H,700H,800H,900H,0A00H,0B00H M=($-BUF1)/2
BUF2 DW 100H,222H,300H,444H,500H,600H,700H,888H,900H,0A00H,0B00H DW 100,200 N=($-BUF2)/2 BUF3 DW M DUP(?) da db 8
DATAS ENDS
STACKS SEGMENT
37
;此处输入堆栈段代码 STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS START:
MOV AX,DATAS MOV DS,AX
lea si,buf1;此处输入代码据段代码 lea di,buf3 mov cx,m lopi:mov ax,[si] lea bx,buf2 mov dx,n lopj:cmp ax,[bx] je lmov add bx,2 dec dx jnz lopj
nextj:add si,2 loop lopi jmp l2
lmov:mov [di],ax add di ,2 jmp nextj
l2: mov dl,0 mov cl,4 lea si,buf3 lopa:mov ax,[si] lopb:mov bx,ax and ax,000fh cmp al,0ah jb p2 add al,7 p2:add al,30h push ax inc dl
mov ax,bx shr ax,cl or ax ,ax jnz lopb lea di,out1
38
l1:pop ax
mov [di],al inc di dec dl jnz l1
mov [di],byte ptr 'H' mov [di+1],byte ptr ' ' mov [di+2],byte ptr '$' lea dx,out1 mov ah,9 int 21h add si,2 dec da jnz lopa MOV AH,4CH INT 21H CODES ENDS END START 运行结果
2、已知某校若干名同学的英语比赛成绩连续存放在以ENGL1为首址的的字存 储区中,最后以两个-1作为结束标志。其存放形式如下图所示。现需求出每一参赛者的考试名次并填入登记项中(即填入每一登记项的第三个字中)。 ENGLI: 学 号1 分 数1 0 分析:根据题目要求,对于每一个考生都要做如下工作:首先求其名次,然后 判断是否是第一名,若是第一名,则将其学号、分数分别送入AX、BX之中。
学 号2 分 数2 0 …….. 39
由于一个学生的考试名次等于成绩高于此学生的人数加1,因此,求每一个学生的考试名次,只要统计出有多少人比他的分数高即可。实际上这是一个顺序查表问题,将待求名次考生的分数与表中每个考生的分数逐一比较,若其分数比别人的分数低,则其名次计数器(初值为1)加1,否则,不做处理。当表中各考生的分数均比较完之后,名次计数器的内容就是考生的名次。根据表的结构,在查表过程中所用的地址增量应为6.当取到分数为-1时,结束查表过程。
对于所有学生只要按表的排列顺序,逐一重复上述操作,就可以求出各人 的名次。因此,此问题是一个二重循环的问题,其内外循环次数均未知,可用表尾设置的结束标志-1控制循环。 寄存器分配情况说明如下: CX :用来存放欲求名次考生成绩。
DX :存放当前被测学生的名次计数器,初值为1.
SI :用作从表中取欲求名次的分数和送名次的指示器,最初指向表首址ENGLI. DI :用作从表中取其他考生分数的指示器。其初值为表首址ENGLI+2 程序清单(将程序补充完整) 建立学生成绩名次表 DATA SEGMENT
ENGLI DW 01H,188H ,0,02H,175H,0,03H,195H,0,04H,163H,0,05H,198H,0 DW 06,178H,0,07H,187H,0,08H,173H,0,09H,190H,0,0AH,160H,0,-1,-1
DATA ENDS
STACK SEGMENT STACK
STA DB 200 DUP (20H) TOP EQU $ — STA STACK ENDS CODE SEGMENT
ASSUME CS :CODE, DS:DATA,SS:STACK START : MOV AX , ________
MOV DS , AX MOV AX , STACK MOV SS , AX MOV SP , TOP LEA SI, _______ MOV BX , 0
LOOPA : MOV DX , 1
CMP [SI],______________;检查所有学生的名次处理完否 JE ______;
MOV CX,[SI+2] ;欲求名次考生的分数送CX LEA DI,ENGLI+2
LOOPB: CMP [DI],_______________;检查表查完否 JE NEXTA
CMP CX , [DI] JAE NEXTB
INC DX;名次加1
40