汇编语言程序设计第五章
5.1 【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)。
5.2 Loop指令
loop指令的格式:loop 标号。CPU执行loop指令有两个步骤:①(cx)=(cx)-1②判断cx中的值,不为零则转至标号处执行程序,如果为零则向下执行。
三个要点:(1)在cx中存放循环的次数。(2)loop指令中的标号所标识的地址要在前面。(3)要循环执行的程序段,要写在标号和loop指令的中间。
程序框架:
mov cx,循环次数
s:
循环执行的程序段
loop s
5.3在Debug中跟踪用loop指令实现的循环程序
在汇编源程序中,数据不能以字母开头,所以要在前面加0。
5.4Debug和汇编编译器masm对指令的不同处理
(1)在汇编语言中,如果一个指令要访问内存单元,则在指令中必须用[...]来表示内存单元,如果在[...]中直接用一个常量idata给出内存地址的偏移地址,就要在"[ ]"前面显示地给出段地址所在的段寄存器。
比如,mov al,ds:[0]
如果没有在“【】”的前面显示的给出段寄存器,比如mov al,[0]那么,编译器masm将把指令中的“【idata】”理解为“idata”。
(2)如果在“【】”里用寄存器,比如bx,间接给出内存单元的偏移地址,则段地址默认在ds中。当然,也可以显示地给出段地址所在的段寄存器。
5.5loop和[bx]的联合应用
5.6段前缀
出现在访问内存单元的指令中,用于显示地指明内存单元的段地址的“ds:”、“cs:”、“ss:”、“es:”,在汇编语言中称为段前缀。
5.7一段安全的空间
(1)直接向一段内存中写入内容,
(2)这段内存空间不应存放系统或其他程序的数据或代码,否则写入操作很可能引发错误;
(3)DOS方式下,一般情况,0:200~0:2ff空间中没有系统或其他程序的数据或代码;
(4)需要直接向一段内存中写入内容时,就使用0:200~0:2ff这段空间。
5.8段前缀的使用(见实验四)