微机实验一之系统认识和分支程序设计

一、系统认识实验

 

        实验内容:

        编写实验程序,将00H~0FH共16个数写入内存3000H开始的连续16个存储单元中,编写实验程序,将00H~0FH共16个数写入内存3000H开始的连续16个存储单元中。

下面直接上代码吧。(都是汇编代码)

SSTACK          SEGMENT    STACK        ; 定义堆栈段
                DW 32 DUP (?)
SSTACK          ENDS

CODE            SEGMENT                 ; 代码段 
                ASSUME CS :CODE, SS :SSTACK


START:          PUSH DS
                XOR AX, AX               ; AX值清零,XOR是异或,自己异或自己则为0了
                MOV DS, AX
                M0V SI, 3000H            ; 建立数据起始地址
                M0V CX, 16               ; 循环次数16次
AA1 :           M0V [SI], AL
                INC SI                   ; 地址自加1
                INC AL                   ; 数据自加1
                LOOP AA1                 ; 循环,次数为CX的值,循环一次CX减一,直到CX为0
                MOV AX, 4C00H
                INT 21H                  ; 程序终止

CODE            ENDS
                END START

 二、分支程序设计实验

        实验内容:

        设计一数据块间的搬移程序。设计思想:程序要求把内存中一数据区(源数据块)传送到另一存储区(目的数据块)。源数据块和目的数据块在存储中可能有三种情况,look at this picture:

喔哦,别急,喝杯爪哇冷静分析下

        对于两个数据块分离的情况,如图(a), 数据的传送从数据块的首地址开始,或从数据块的末地址开始均可。但是对于有重叠的情况,则要加以分析,否则重叠部分会因“搬移”而遭到破坏,可有如下结论:
        当源数据块首地址<目的块首地址时,从数据块末地址开始传送数据,如图(b) 所示。
        当源数据块首地址>目的块首地址时,从数据块眉地址开始传送数据,如图 (c) 所示。

        那木,直接上代码吧,吗?好像太直接了,来个流程图,先。

(判断[SI] > [DI]这里其实不应该加方括号的,不想改了,because这图是我借的)

    好,可以上代码了。

SSTACK	SEGMENT STACK
		DW 64 DUP(?)
SSTACK	ENDS

CODE	SEGMENT
		ASSUME CS:CODE

START:	MOV CX, 0010H        ; 移动16次
		MOV SI, 3100H
		MOV DI, 3200H
		CMP SI, DI           ; 比较指令,最后有详细介绍
		JA A2                ; SI大于DI,则跳转,最后也有介绍

        ; 如果不跳转,则从尾部开始移动数据

		ADD SI, CX
		DEC SI               ; 把源地址尾部给SI
		ADD DI, CX
		DEC DI               ; 把目标地址尾部给DI     

A1:		MOV AL, [SI]         ; 把DS:SI内存地址处的值给AL
		MOV [DI], AL         ; 把AL处的值填入DS:SI内存地址
		DEC SI               ; 自减一
		DEC DI               ; 自减一
		DEC CX               ; 从尾部开始移动数据,则移动一次,计数值自减一
		JNE A1               ; ZF标志位为0时跳转,说明运算结果不为0
		JMP A3               ; 转移完数据,跳到最后,结束程序

A2:		MOV AL, [SI]         ; 把源地址值给SI
		MOV [DI], AL         ; 把AL值填入DI内存地址
		INC SI               ; 自加一
		INC DI               ; 自加一
		DEC CX               ; 从头部开始移动数据,则移动一次,计数值自减一
		JNE A2               ; ZF标志位为0时跳转,说明运算结果不为0

A3:		MOV AX,4C00H
		INT 21H				 ; 程序终止

CODE	ENDS
		END START

        代码中的CMP SI, DI虽然是比较指令,但其实是用DI的值减去SI的值,结果不保存,但是会影响flag标志寄存器相应的值,和SUB指令相似,只是CMP不保存运算结果。想进一步了解详细的细节,可以参考这篇博客。汇编语言——标志寄存器 - 想54256 - 博客园

hei hei,感谢阅读,本人水平,若有错误,请不吝赐教。

  • 5
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值