一、系统认识实验
实验内容:
编写实验程序,将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,感谢阅读,本人水平,若有错误,请不吝赐教。