在第四章学会了基础编写的基础上,我们在第五章介绍一个特殊的指令loop来完成循环式的结构。
特别规定:(XX)代表XX中的内容
(一)Loop指令的用法和作用
loop指令的格式是:loop 标号,CPU执行loop指令的时候,要进行两步操作,①(cx)=(cx)-1,②判断cx的值是否为零,不为零则转至标号处继续执行程序,为零则跳出循环继续向下执行
举例一个简单的循环程序:
assume cs:code
code segment
mov ax,2
mov cx,11
s:add ax,ax
loop s
mov ax,4c00h
int 21h
code ends
end
这个程序的作用是计算2的12次方
从中我们可以发现,cx中的值代表的是循环的次数,标号s与loop s之间就是循环执行的代码段
我们同样可以通过debug来对循环程序进行单步追踪,这里介绍两个新的debug指令:
-g 偏移地址: 使得执行到cs:偏移地址处停止;
-p:直接重复执行循环代码直至循环结束
(二)段前缀
在指令“mov ax,[bx]”中,偏移地址由bx给出,而段地址在默认的ds中。我们也可以在访问指令中显式地给出段地址所处的段寄存器,如:mov ax,es:[bx] .这就是段前缀
在前面的学习中,我们可以用Debug中直接写入指令,[idata]表示((段地址)*16+idata)处的值。但是在汇编源代码中,[idata]代表idata这个数值。因此在汇编源代码中以[idata]表示偏移地址时,须加前缀以显式表明,比如:ds:[idata],这就是段前缀的作用之一。同时,在程序中出现几处需要改动段地址时,我们可以用段前缀显式指定不同的段寄存器来存放不同的段地址,而不用一次次的更改ds。
注意,在CPU中随意向一段内存空间写入数据是很危险的,因为我们并不知道这段空间原来是否已经存放了数据,这很可能导致你会覆盖某些重要的代码甚至是系统数据。所以我们在编写前一定要查看一下其中的内容,一般来说0:200~0:2ff这段空间是安全的,不会被其他程序占用。