汇编-5.0-[BX]和loop指令

1.要完整的描述一个内存单元,需要两种信息:1.内存单元的地址;2.内存单元的长度(类型)。
2.“()”表示一个寄存器或一个内存单元中的内容。如:(ax)表示ax中的内容。
“()”中的元素可以有3种类型:1.寄存器名;2.段寄存器名;3.内存单元的物理地址(一个20位的数据)。
3.约定符号idata表示常量
用idata表示常量。
3.[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)).
4.loop指令
loop指令的格式:loop标号,CPU执行loop指令,要进行两步操作,
(1).(cx)=(cx)-1;
(2).判断cx中的值,不为零则转至标号处执行程序,如果为零则转向下执行。
可以看出:cx中的值影响loop指令的执行结果。通常我们用loop指令来实现循环功能,cx中存放循环次数。
5.Debug和汇编编译器masm对指令的不同处理
(1).Debug中,mov ax,[0]表示将ds:0处的数据送入ax中。
(2).在汇编程序中,“mov ax,[0]”被编译器当作指令“mov ax,0”处理。
即:[idata]在Debug时,Debug将它解释为一个内存单元,“idata”是内存单元的地址偏移;而编译器将“[idata]”解释为“idata”。在源程序中,要访问内存单元,可以将偏移地址先送入bx寄存器中,用[bx]的方式来访问内存单元。又或者在“[]”里面用一个常量idata直接给出内存单元的地址偏移地址,就要在“[]”的前面显式的给出段地址所在的寄存器,如:mov al,ds:[0]。
6.段前缀
指令“mov ax,[bx]”中,内存单元的偏移地址由bx给出,而段地址默认在ds中。我们可以在访问内存单元的指令中显式的给出内存单元的段地址所在的段寄存器。
(1).mov ax,ds:[bx]
将一个内存单元的内容送入ax,这个内存单元的长度为2个字节(字单元),存放在一个字,偏移地址在bx中,段地址在ds中。
(2).mov ax,cs:[bx]
将一个内存单元的内容送入ax,这个内存单元的长度为2个字节(字单元),存放在一个字,偏移地址在bx中,段地址在cs中。
……
7.一段安全的空间
在8086模式中,随意向一段内存空间写入内容是很危险的,因为这段空间中可能存在重要的系统数据或代码。
(1).我们需要直接向一段内存中写入内容:
(2).这段空间不应存放系统或其他程序的数据或代码,否则写入操作可能引发错误。
(3).DOS方式下,一般情况,0:200~0:2ff空间中没有系统或其他程序的数据或代码。
(4).以后可以直接使用0:200~0:2ff这段空间。

猜你喜欢

转载自blog.csdn.net/changjucha3459/article/details/81129635