华工微机与接口实验[分支和循环程序设计实验]

一,实验内容:
设计一数据块间的搬移程序
设计思想:
程序要求把内存中一数据区(称为源数据块)传送到另一存贮区(称为目的数据块)。源数据块和目的数据块在存贮中可能有三种情况。
对于两个数据块分离的情况,数据的传送从数据块的首址开始,或者从数据块的末址开始均可,但对于有部分重叠的情况,则要加以分析,否则重叠部分会因“搬移”而遭破坏。
可以得出以下结论:当源数据块首址>目的块首址时,从数据块首址开始传送数据。当源数据块首址<目的块首址时,从数据块末地址开始传送数据。
二,实验设计原理;
在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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值