微机原理分支程序设计实验

  • 实验目的

1. 掌握分支程序的结构。

2. 掌握分支程序的设计、调试方法。

  • 实验内容

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

图 1源数据块与目的数据块在储存中的位置情况

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

当源数据块首地址>目的数据块首地址时,从数据块首地址开始传送数据,如图1 (c) 所示。

  • 实验步骤
  1. 按流程图编写实验程序,经编译、链接无误后装入系统。

2.用 E 命令在以 SI 为起始地址的单元中填入 16 个数。E编辑指定地址单元中的数据格式:E[[段址]:偏移量]

该命令执行后,则按字节显示或修改数据,可通过“空格”键进入下一高地址单元数据的修改,使用 “-”键则进入下一低地址单元进行数据的修改,并可填入新的数据来修改地址单元的内容。若输入回车,则结束 E命令。例

显示内容

输入内容

>

E0000:3500 按回车键

0000:3500 CC_

00 按空格键

0000:3501 CC_

01 按空格键

0000:3502 CC_

02 按空格键

0000:3503 CC_

  1. 按空格键

3.运行程序,待程序运行停止。

4. 通过 D 命令查看 DI 为起始地址的单元中的数据是否与 SI 单元中数据相同。D 显示一段地址单元中的数据格式:D[[段址:]起始地址,[尾地址]]

D命令执行后屏幕上显示一段地址单元中的数据,在显示过程中,可用Ctrl+S来暂停显示,用任意键继续;也可用Ctrl+C终止数据显示,返回监控状态。

5. 通过改变 SI、DI 的值,观察在三种不同的数据块情况下程序的运行情况,并验证程序的功能。

四、实验程序

SSTACK SEGMENT STACK

DW 64 DUP(?)

SSTACK ENDS

CODE SEGMENT

ASSUME CS:CODE,SS:SSTACK

START: XOR AX,AX

        MOV DS,AX

        MOV CX, 0010H        

        MOV SI, 3500H

        MOV DI, 3520H

        CMP SI, DI

        JZ A3      

        JA A2        

        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               ; 从尾部开始移动数据,则移动一次,计数值自减一

        JNZ A1               ; ZF标志位为0时跳转,说明运算结果不为0

        JMP A3               ; 转移完数据,跳到最后,结束程序

A2: MOV AL, [SI]      

        MOV [DI], AL         ; 把AL值填入DI内存地址

        INC SI             

        INC DI             

        DEC CX               ; 从头部开始移动数据,则移动一次,计数值自减一

        JNZ A2               ; ZF标志位为0时跳转,说明运算结果不为0

        JMP A3

A3: MOV AX,4C00H

        INT 21H  ; 程序终止

        CODE ENDS

        END START

  • 实验结果

通过观察Address的变化来判断数据块间的搬移情况,红色为数据区改变。

1. 对于源块和目的块分离的情况,不论是从数据块的首址还是末址开始传送都可以。

2.对于源块与目的块有重叠且源块首址<目的块首址的情况,必须从数据块末址开始传送

3.对于源块与目的块有重叠且源块首址>目的块首址的情况,必须从数据块首址开始传送

将上述三种情况综合起来,只考虑源块和目的块的地址相对大小,传送方法如下:

当源块首地址<目的块首地址时,从数据块末地址开始传送。反之,则从首地址开始传送

六、思考题

如果在传送过程中需要删掉字符“A”,程序应如何修改,试编程验证。

程序修改如下:

SSTACK SEGMENT STACK

DW 64 DUP(?)

SSTACK ENDS

CODE SEGMENT

ASSUME CS:CODE,SS:SSTACK

START: XOR AX,AX

        MOV DS,AX

        MOV CX, 0010H        

        MOV SI, 3500H

        MOV DI, 3520H

        CMP SI, DI

        JZ A3      

        JA A2        

        ADD SI, CX

        DEC SI               ; 把源地址尾部给SI

        ADD DI, CX

        DEC DI               ; 把目标地址尾部给DI     

A1: MOV AL, [SI]         ; 把DS:SI内存地址处的值给AL

        CMP AL,'A'

        JZ A4

        MOV [DI], AL         ; 把AL处的值填入DS:SI内存地址

A4: DEC SI              

        DEC DI              

        DEC CX               ; 从尾部开始移动数据,则移动一次,计数值自减一

        JNZ A1               ; ZF标志位为0时跳转,说明运算结果不为0

        JMP A3               ; 转移完数据,跳到最后,结束程序

A2: MOV AL, [SI]      

        CMP AL,'A'

        JZ A5

        MOV [DI], AL         ; 把AL值填入DI内存地址

A5: INC SI             

        INC DI             

        DEC CX               ; 从头部开始移动数据,则移动一次,计数值自减一

        JNZ A2               ; ZF标志位为0时跳转,说明运算结果不为0

        JMP A3

A3: MOV AX,4C00H

        INT 21H  ; 程序终止

         CODE ENDS

        END START

编程验证如下:

  • 实验心得

    通过本次分支程序设计实验,我更加了解了wmdx86软件的用法,知道了在哪观察数据块搬移变化情况,对于数据块搬移,要考虑数据块之间的分离情况,若不重叠,不论是从数据块的首址还是末址开始传送都可以,若有重叠,则要加以考虑分析,避免重叠部分应“搬移”而遭到破坏。其次,在编写程序之前,先确定算法,并绘制程序流程图,程序流程图可以直观地表示算法的流向,在编写程序时还应该注意,要搞清楚所使用的CPU,了解其指令系统、寻址方式和有关的伪指令。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Φρουρ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值