一、[BX]
[bx] 同样也表示一个内存单元,它的偏移地址在 bx 中,比如下面的指令:
mov ax,[bx]
二、loop 指令
通常我们用 loop 指令来实现循环功能,cx 中存放循环次数
案例:计算 2^12
codesg segment
mov ax,2
mov cx,11
s: add ax,ax
loop s
mov ax,4C00H
int 21H
codesg ends
end
CPU 执行 loops 的时候,要进行两步操作:
1:(cx)(cx)-1;
2:判断 cx 中的值,不为0则转至标号s所标识的地址处执行(这里的指令是 add ax,ax),如果为0则执行下一条指令(下一条指令是 mov ax,4c00h)。
三、Debug 和汇编编译器 masm 对指令的不同处理
(1) 在汇编源程序中,如果用指令访问一个内存单元,则在指令中必须用"[...]"来表示内存单元,如果在"门"里用一个常量 idata 直接给出内存单元的偏移地址,就要在"[]"的前面显式地给出段地址所在的段寄存器。比如
mov al,ds:[0]
如果没有在 "[]" 的前面显式地给出段地址所在的段寄存器,比如
mov al,[0]
那么,编译器 masm 将把指令中的"[idata]"解释为"idata"
(2) 如果在"门"里用寄存器,比如 bx,间接给出内存单元的偏移地址,则段地址默认在 ds 中。当然,也可以显式地给出段地址所在的段寄存器。
四、段前缀
mov ax,cs:[0]
mov ax,ss:[0]
mov ax,es:[bx]
mov ax,ss:[bx]
mov ax,ds:[bx]
这些出现在访问内存单元的指令中,用于显式地指明内存单元的段地址的 "ds:","cs:","ss","es"在汇编语言中称为段前缀
五、一段安全的空间
-
我们需要直接向一段内存中写入内容;
-
这段内存空间不应存放系统或其他程序的数据或代码,否则写入操作很可能引发错误;
-
DOS 方式下,一般情况,0:200~0:2ff 空间中没有系统或其他程序的数据或代码;
-
以后,我们需要直接向一段内存中写入内容时,就使用 0:200~0:2ff这段空间。