1. 掌握分支程序的结构。 2. 掌握分支程序的设计、调试方法。 | ||||||||||||
设计一数据块间的搬移程序。设计思想:程序要求把内存中一数据区(称为源数据块)传送到另一存储区(称为目的数据块)。源数据块和目的数据块在存储中可能有三种情况,如图所示。 图 1源数据块与目的数据块在储存中的位置情况 对于两个数据块分离的情况,如图(a), 数据的传送从数据块的首地址开始,或从数据块的末地址开始均可。但是对于有重叠的情况,则要加以分析,否则重叠部分会因“搬移”而遭到破坏,可有如下结论: 当源数据块首地址<目的数据块首地址时,从数据块末地址开始传送数据,如图1 (b) 所示。 当源数据块首地址>目的数据块首地址时,从数据块首地址开始传送数据,如图1 (c) 所示。 | ||||||||||||
2.用 E 命令在以 SI 为起始地址的单元中填入 16 个数。E编辑指定地址单元中的数据格式:E[[段址]:偏移量] 该命令执行后,则按字节显示或修改数据,可通过“空格”键进入下一高地址单元数据的修改,使用 “-”键则进入下一低地址单元进行数据的修改,并可填入新的数据来修改地址单元的内容。若输入回车,则结束 E命令。例
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,了解其指令系统、寻址方式和有关的伪指令。 |
微机原理分支程序设计实验
于 2024-07-28 17:43:16 首次发布