一,实验内容:
设计一数据块间的搬移程序
设计思想:
程序要求把内存中一数据区(称为源数据块)传送到另一存贮区(称为目的数据块)。源数据块和目的数据块在存贮中可能有三种情况。
对于两个数据块分离的情况,数据的传送从数据块的首址开始,或者从数据块的末址开始均可,但对于有部分重叠的情况,则要加以分析,否则重叠部分会因“搬移”而遭破坏。
可以得出以下结论:当源数据块首址>目的块首址时,从数据块首址开始传送数据。当源数据块首址<目的块首址时,从数据块末地址开始传送数据。
二,实验设计原理;
在DOS中数据搬移为防止在地址重叠的情况下数据搬移出错,设定了一些搬移规则,即:
当源数据块首址>目的块首址时,从数据块首址开始传送数据。当源数据块首址<目的块首址时,从数据块末地址开始传送数据
代码::
DATAS SEGMENT
COUNT EQU 6
ORG 14H
SOURCE DB '0','1','2','3','4','5'
ORG 16H
RESULT DB 10 DUP(?)
DATAS ENDS
STACKS SEGMENT STACK 'STACK'
DW 20H DUP(0)
TOP LABEL WORD
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,STACKS
MOV SS, AX
MOV SP, OFFSET TOP
MOV AX,DATAS
MOV DS,AX
MOV ES, AX ;初始化
MOV SI, OFFSET SOURCE ;SI指向原来数据地址
MOV DI, OFFSET RESULT ;DI指向搬移之后的数据地址
MOV CX, COUNT ;输入的个数为6
CLD ;递增传数据
CMP SI, DI
JAE NEXT ;无符号大于或等于则跳转
MOV AX, CX
DEC AX
ADD SI, AX ;SI+CX-1
ADD DI, AX ;DI+CX-1
STD ;递减传数据
NEXT:
REP MOVSB
MOV AH,4CH
INT 21H
CODES ENDS
END START
; STD, 功能是方向标志DF置1,
;位置指针SI或DI往反向(地址减小大方向)移动,字串处理是由后往前
;CLD,功能是方向标志DF清零,
;位置指针SI或DI往正向(地址增大方向)移动,字串知处理是由前往后;
设计二:循环程序设计实验
实验内容:
(1)编制程序使S=1+23+34+4*5+……N(N+1),直到N(N+1)项大于200为止。
(2)求某个数据区内负数的个数
设数据区的第一单元存放区内数据的个数,从第二单元开始存放数据,在区内最后一个单元存放结果。
为统计数据区内负数的个数,需要逐个判断区内的每一个数据,然后将所有数据中凡是符号位为1的数据的个数累加起来,即得区内所包含负数的个数。
实验设计原理;
(1)简单的递增+乘法,以及对JUMP指令的运用
(2)在二进制中,负数即是带符号数中最高位为1,通过与1000和待测数高4位进行TEST指令,可判断出最高位是否为1.
(1)
DATAS SEGMENT
;此处输入数据段代码
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
MOV SI, 10H ;给定SI初始指向10H
MOV CX, 1 ;流程图中用到了DX,这里改为CX
MOV BL, 2
MOV AH, 0
MOV BH, 0
LOOP1:
MOV AL, BL
INC BX
MUL BL ;AL*BL
ADD CX, AX
CMP AX, 200
JBE LOOP1 ;无符号不大于等于则跳转
MOV [SI], CX ;将结果保存到SI所指向的地方
MOV AH,4CH
INT 21H
CODES ENDS
END START
;建议不要放到DX,而是放到CX,应为相乘的时候会借用DX
(2)
DATAS SEGMENT
ORG 10H
NUM DB 6
SOURCE DB 12H, 88H, 82H, 90H, 22H, 33H
ORG 20H
RESULT DB ?
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
MOV DI, OFFSET NUM
MOV CL, NUM
INC DI
MOV CH, 0
MOV BL, 0 ;记录负数个数
LOOP1:
MOV AL, [DI]
TEST AL, 80H ;test逻辑与运算结果为零,就把ZF(零标志)置1
JZ NEXT ;如果ZF=0,说明不是负数,跳转
INC BL ;如果不为0,说明最高位为1,是负数
NEXT:
INC DI ;指向下一个数
DEC CX ;记录还剩下多少个数,为0则结束
JNZ LOOP1
MOV [RESULT], BL ;将BL的值赋给RESULT所在地址
MOV AH,4CH
INT 21H
CODES ENDS
END START