[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]