微机实验--子程序设计

  • 格式:docx
  • 大小:232.48 KB
  • 文档页数:34

精品 welcome 微机实验三 分支和循环程序设计实验 一、分支程序设计实验 1.实验目的 1.掌握分支程序的结构。 2掌握分支程序的设计、调试方法。 2.实验设备 微机一台 3.内容 设计一数据块间的搬移程序 设计思想: 程序要求把内存中一数据区(称为源数据块)传送到另一存贮区(称为目的数据块)。源数据块和目的数据块在存贮中可能有三种情况。

对于两个数据块分离的情况,数据的传送从数据块的首址开始,或者从数据块的末址开始均可,但对于有部分重叠的情况,则要加以分析,否则重叠部分会因“搬移”而遭破坏。

可以得出以下结论:当源数据块首址〉目的块首址时,从数据块首址开始传送数据。当源数据块首址〈目的块首址时,从数据块末地址开始传送数据。

流程图: 精品

welcome 结果: 在源数据块中存入6个数,分别使SI大于、等于、小于DI均发觉数据正确传送。可见程序正确。

实现代码如下: DATA SEGMENT ORG 3500H SRC_MESS DB 1,2,3,4,5,6 ORG 3510H 精品 welcome NEW_LOC DB 20 DUP(0) DATA ENDS ; CODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA START: MOV AX,DATA MOV DS,AX MOV ES,AX LEA SI,SRC_MESS LEA DI,NEW_LOC MOV CX,6 CLD ;DF置0 CMP SI,DI ;源数据块首址〈目的块首址时,从数据块末地址开始传送数据。 JL NEXT1 ;如果SI小于DI,则跳转到NEXT1(否则直接执行NEXT2) NEXT2: REP MOVSB NEXT1: ADD SI,CX ; SI=SI+CX-1 从末地址开始传递数据 DEC SI ; ADD DI,CX ;DI+=DI+CX-1 DEC DI ; STD ; DF置1 JMP NEXT2 ; 精品 welcome CODE ENDS END START 结果显示:将3500H开始的1,2,3,4,5,6复制到3510H开始的地址。

DATA SEGMENT ORG 3500H SRC_MESS DB 1,2,3,4,5,6 DATA ENDS ; CODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA START:MOV AX,DATA MOV DS,AX MOV ES,AX 精品 welcome LEA SI,SRC_MESS MOV DI,3502H MOV CX,6 CLD ;DF置0 CMP SI,DI ;源数据块首址〈目的块首址时,从数据块末地址开始传送数据。 JL NEXT1 ;如果SI小于DI,则跳转到NEXT1(否则直接执行NEXT2) NEXT2: REP MOVSB MOV AH,4CH INT 21H

NEXT1: ADD SI,CX ; SI=SI+CX-1 从末地址开始传递数据 DEC SI ; ADD DI,CX ;DI+=DI+CX-1 DEC DI ; STD ; DF置1 JMP NEXT2 ; CODE ENDS END START

结果显示:将3500H开始的连续的1,2,3,4,5,6复制搬移到3502H开始的地址。 此时,搬移过程应当从数组的最后一个数字6开始搬移,一直到最前面的3500H对应的的数字01搬移到3502H地址为止。 精品 welcome DATA SEGMENT ORG 3502H SRC_MESS DB 1,2,3,4,5,6 DATA ENDS ; CODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA START:MOV AX,DATA MOV DS,AX MOV ES,AX LEA SI,SRC_MESS MOV DI,3500H MOV CX,6 CLD ;DF置0 精品 welcome CMP SI,DI ;源数据块首址〈目的块首址时,从数据块末地址开始传送数据。 JL NEXT1 ;如果SI小于DI,则跳转到NEXT1(否则直接执行NEXT2) NEXT2: REP MOVSB MOV AH,4CH INT 21H

NEXT1: ADD SI,CX ; SI=SI+CX-1 从末地址开始传递数据 DEC SI ; ADD DI,CX ;DI+=DI+CX-1 DEC DI ; STD ; DF置1 JMP NEXT2 ; CODE ENDS END START

结果显示:将3502H开始的1,2,3,4,5,6搬移到3500H开始的地址,应该从3502H地址开始传数据到3500H,依次往后搬移。 精品

welcome 二、循环程序设计实验 1.实验目的 (1)加深对循环结构的理解。 (2)掌握循环结构程序设计的方法。 (3)熟练掌握调试循环程序的方法。 2.实验设备 TDS-MD微机一台 3.内容 (1)编制程序使S=1+2*3+3*4+4*5+……N(N+1),直到N(N+1)项大于200为止。 流程图: 精品

welcome 实现代码: DATA SEGMENT ORG 3500H HELLO DB 32 DUP(0) DATA ENDS ; CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV DX,1 ;DX存储总和

N Y

开始 1→DX,2→BL BL→AL BL+1

AL*BL→AX DX+AX→DX

结束 AX>200 精品

welcome MOV BL,2 ;BL存储被乘项 NEXT: MOV AL,BL; AL存储被乘项 INC BL ; MUL BL ; 结果存储在AX ADD DX,AX CMP AX,200 JL NEXT MOV BX,3500H MOV [BX],DX MOV BX,3510H MOV [BX],AX

MOV AH,4CH INT 21H CODE ENDS END START

结果与分析: 运行结果为045FH,与实际相符,程序正确。 精品

welcome (2)求某个数据区内负数的个数 设数据区的第一单元存放区内数据的个数,从第二单元开始存放数据,在区内最后一个单元存放结果。

为统计数据区内负数的个数,需要逐个判断区内的每一个数据,然后将所有数据中凡是符号位为1的数据的个数累加起来,即得区内所包含负数的个数。 精品

welcome 流程图: 实现代码: DATA SEGMENT ORG 3500H HELLO DB 6,3,-58,-34,7,-2,29 ;6是数据的个数,共有6个数据 ORG 3510H NUM_T DB 16 DUP(0) ;3510H单元存结果 DATA ENDS ; 精品 welcome CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA ;初始化数据段 MOV DS,AX MOV DI,3500H ;数据区的首地址给DI MOV CL,[DI] ;数据的个数给CL,作为NEXT1循环的个数 INC DI ;DI指向第一个需要比较的数据 MOV CH,0 MOV BL,0 NEXT1: MOV AL,[DI] AND AL,80H ;AL与1000(B)做按位与操作,如果是负数,AL存储的是1000(B),否则存储的是0

CMP AL,80H ;如果是负数,AL与80H相等 JE NEXT2 ;如果是负数,跳转到NEXT2 GOGO: INC DI LOOP NEXT1 MOV DI,3510H MOV [DI],BL MOV AX,4C00H ;返回DOS INT 21H NEXT2: INC BL 精品 welcome JMP GOGO CODE ENDS END START

结果与分析: 输入数据个数为6 输入3,-58,-34,7,-2,29得结果03,存放在3510H地址。其中3500H地址对应的数字6是原始数据的个数。

结果与实际相符,程序正确。

输入数据个数为6 输入3,-58,-34,7,-2,-29得结果04,存放在3510H地址。其中3500H地址对应的数字6是原始数据的个数。

结果与实际相符,程序正确。