《汇编语言》– [BX]和loop指令 包含多个段的程序

[BX]和loop指令

 

①:[BX]也表示一个内存单元,它的偏移地址在bx中,比如:

mov ax,[bx]

将一个内存单元的内容送入ax,这个内存单元的长度为2字节(字单元),存放一个字,偏移地址在bx中,段地址在ds中。

 

inc bx的含义是bx中的内容加1

 

②:loop指令的格式是:loop 标号,CPU执行loop指令的时候,要进行两步操作:

1.(cx) = (cx) – 1。

2.判断cx中的值,不为零则转至标号处执行程序,如果为零则向下执行。

cx中存放的是循环的次数。

      mov cx,循环次数

S:

     循环执行的程序段

     loop s                  ;修改IP的值

 

③:在汇编源程序中,数据不能以字母开头。

g 0016 直接执行到CS:0016处。

 

④:在汇编源程序中,如果用指令访问一个内存单元,则在指令中必须用“[…]”来表示内存单元,如果在“[]”里用一个常量idata直接给出内存单元的偏移地址,就要在“[]”的前面显式的给出段地址所在的寄存器。

mov al,ds:[0]

如果是:

mov al,[0]

那么编译器masm将把指令中的“[idata]”解释为“idata”

如果在“[]”里用寄存器,比如bx,间接给出内存单元的偏移地址,则段地址默认在ds中。当然也可以显式给出段地址所在的寄存器。

 

用于显式指明内存单元的段地址的“ds:” “cs:” “ss:” “es:” ,在汇编语言中称为段前缀。

 

⑤:一段安全的空间:

1.我们需要直接向一段内存中写入内容;

2.这段内存不应该存放系统或者其他程序的数据或代码,否则写入操作很可能引发错误;

3.DOS方式下,一般情况,0:200~0:2ff这段空间中没有系统或者其他程序的数据或代码;

4.以后,我们需要直接向一段内存中写入内容时,就是用0:200~0:2ff这段空间。

 

包含多个段的程序

 

①:直接用start指明程序开始执行的地方

assume cs:code

code segment

        数据

start:

       代码

code ends

end start

 

②:将数据,代码,栈放入不同的段

assumu cs:code,ds:data,ss:stack

对段地址的引用

mov ax,data

mov ds,ax

mov bx,ds:[6]

本文链接:http://www.alonemonkey.com/masm-chapter56.html