要完整地描述一个内存单元,需要两种信息:(1)内存单元的地址 (2)内存单元的长度(类型)
用[0]表示一个内存单元时,0表示单元的偏移地址,段地址默认在ds中,单元的长度(类型)可以由具体指令中的其他操作对象(比如说寄存器)指出。
[bx]同样也表示一个内存单元,它的偏移地址在bx中,比如下面的指令:
mov ax, [bx] : 将一个内存单元的内容送入ax,这个内存单元的长度为2字节,存放一个字,偏移地址在bx中,段地址在ds中。
mov al, [bx] : 将一个内存单元的内容送入a1,这个内存单元的长度为1字节,存放一个字节,偏移地址在bx中,段地址在ds中。
loop和循环有关。
()表示一个寄存器或一个内存单元中的内容。()中的元素可以有3种类型:1> 寄存器名 2> 段寄存器名 3> 内存单元的物理地址
注:(ax)表示ax中的内容
(X)所表示的数据有两种类型:1>字节 2>字 是哪种类型由寄存器或者具体的运算决定
约定符号 idata 表示常量,在 [ ] 中使用
[BX]
mov ax,[bx]
功能∶ bx 中存放的数据作为一个偏移地址 EA,段地址 SA 默认在 ds 中,将SA∶EA 处的数据送入 ax中。即∶(ax)=((ds)*16+(bx))。
mov [bx], ax
功能∶ bx 中存放的数据作为一个偏移地址 EA,段地址 SA 默认在 ds中,将 ax中的数据送入内存SA∶EA 处。即∶((ds)*16+(bx))=(ax)。
Loop指令
格式:loop 标号,CPU 执行 loop 指令的时候,要进行两步操作,①(cx)=(cx)-1; ②判断 cx 中的值,不为零则转至标号处执行程序,如果为零则向下执行。
通常我们用loop指令来实现循环功能,cs中存放循环次数。
总结:
(1)在cx中存放循环次数
(2)loop指令中的标号所标识地址要在前面
(3)要循环执行的程序段,要写在标号和loop指令的中间
用cx 和loop指令相配合实现循环功能的程序框架如下 (s为标号):
mov cx,循环次数
s:
循环执行的程序段
loop s
debug命令g:
“g 0012” : 表示执行程序到当前代码段 ( 段地址在CS中 ) 的0012h处。
也就是说:将使debug从当前的CS:IP指向的指令执行,一直到(IP)==0012h为止。
在 Debug中∶
mov ax,[0]
表示将 ds∶0处的数据送入 ax中。
(使用-a命令输入汇编指令执行)
但是在汇编源程序中,指令"mov ax,[0]"被编译器当作指令"mov ax,0"处理。
(编译-连接-执行)
方法:
1> 可将偏移地址送入bx寄存器中,用 [bx] 的方式来访问内存空间。
mov ax,2000h
mov ds,ax ;段地址2000h送入ds
mov bx,0 ;偏移地址送入bx
mov al,[bx] ;ds:bx单元中的数据送入al
2> 要在 “[ ]” 前面显式地给出段地址所在的段寄存器。就可以在 “[ ]” 中直接给出内存单元的偏移地址。
mov ax,2000h
mov ds,ax
mov al, ds:[0]
小结:
(1) 在汇编源程序中,如果用指令访问一个内存单元,则在指令中必须用"[…]“来表示内存单元,如果在”[ ]“里用一个常量 idata 直接给出内存单元的偏移地址,就要在”[ ]“的前面显式地给出段地址所在的段寄存器。比如
mov al, ds:[0]
如果没有在”[ ]“的前面显式地给出段地址所在的段寄存器,比如mov al, [0],那么,编译器 masm 将把指令中的”【idata】“解释为"idata”。
(2) 如果在"[ ]"里用寄存器,比如 bx,间接给出内存单元的偏移地址,则段地址默认在 ds 中。当然,也可以显式地给出段地址所在的段寄存器。
这些出现在访问内存单元的指令中,用于显式地指明内存单元的段地址的"ds∶" “cs∶” “ss∶” “es∶”,在汇编语言中称为段前缀。