bx和loop指令
【bx】
在debug程序中,我们可以直接使用:
mov ax,[0]
将DS:0地址处的数据送入ax寄存器中,但是我们在编写源程序时候,如果也写成上述形式,则会被编译器解释成
mov ax,0
若要想达到同样的目的,有几种方法可以实现:
-
我们可以使用一个寄存器bx来保存偏移地址,然后
mov ax,[bx]
这样编译后就没问题了,相当于是把bx当作一个变量
-
mov ax,ds:[0]
这样也能让编译器正确理解
-
mov ax,ds:[bx],同上
loop(英文单词有循环的含义)
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
这是一个运用loop很典型简单的程序,它是要计算2的12次方
- 程序中有一个标号s,它标识了一个地址,这个地址处有一条指令add ax,ax
- 执行loop时候,需要进行两步操作:cx=cx-1和判断cx中的值(cx不为零则继续循环,为0则出循环)
所以我们可以通过控制cx来控制add ax,ax的执行次数
g命令和p命令
- g命令
g+偏移地址,这个指令会自动执行程序指导ip指向目标的偏移地址。不想一个t一个t执行的时候,这个命令可以帮我们快速跳转到我们想要执行的指令位置 - p命令
在循环次数比较多的时候,我们可以用这个指令直接一次运行到loop结束的时候
loop和【bx】联合应用
- 这里就是把bx当作一个循环里的变量,每循环一次bx就会加1,以指向不同的地址
段前缀
我们一般的是将ds的值默认当作段地址,如
mov ax,[bx]
但是我们还可以换一种写法,如
mov ax,cs:[bx]
这样就可以把寄存器cs中的值当做段地址,同理不止cs可以当,其他的寄存器也可以
安全的空间
我们一般是不能随意的指定一段内存空间去写入数据的,因为有可能在这段内存空间中存储着十分重要的数据,而我们的写入改变了这些数据,会引起一些致命的问题。
在书中,告诉我们0:200~0:2ff这段256字节的空间是安全的,数据一般不会保存在这里,我们可以放心使用