【汇编】[BX]和loop

发布时间 2023-08-03 14:48:13作者: 阿初

[BX]

之前讲一个内存单元送入寄存器是用的 mov ax [0],这里用的 [0]。

要描述一个完整的内存单元,需要两种信息:

  1. 内存的单元地址。
  2. 内存的单元长度。

mov ax [0]
在[0]表示一个内存单元时,0表示单元偏移地址,默认地址在ds中。单元的长度由ax指出。

[bx] 也表示一个内存单元,偏移地址在bx中。

分析

mov ax, [bx]
[bx] 表示一个内存单元,偏移地址在bx中,段地址在ds中,长度为2字节(ax是16位),存放一个字型数据。

mov al, [bx]
[bx] 表示一个内存单元,偏移地址在bx中,段地址在ds中,长度为1字节(ax是8位),存放一个字节型数据。

loop

循环指令。要设置一个标号为循环段的起点。

循环次数保存在cx中。每循环一次,cx自减一,不为0则跳转至标号处执行程序,为0则向下执行。

mov cx, 循环次数
loopCode: 循环程序段
loop loopCode

cx如果在循环程序段中被改变了,就有可能死循环。

debug和汇编编译器masm对指令的不同处理

在debug中可以使用 mov ax, [0],意思是将ds:0的数据存入ax中。
但是在汇编源程序中,[0]是不生效的,会被识别成 mov ax, 0,所以使用的时候需要先将内存地址放至寄存器中然后在mov。
例:

mov bx, 0
mov ax, [bx]

或者如果想用 [0] 这种方法,就需要带上段寄存器地址。
例:mov ax, ds:[0]
这种方法在debug里不能用,但是在汇编源程序中能用。

总之,如果在[]中是常量数字,则直接给出数字。
如果是寄存器,则间接给出内存单元的地址。默认不写自动是ds,也可以写成mov ax, ds:[bx](段前缀)

段前缀

段前缀在dosbox debug下用不了,要写在汇编程序中。

; 将一个内存单元的内容送入 ax,这个内存单元的长度为2字节,存放一个字型数据,偏移地址在bx中,段地址在ds中。
mov ax, ds:[bx]

; 将一个内存单元的内容送入 ax,这个内存单元的长度为2字节,存放一个字型数据,偏移地址在bx中,段地址在cs中。
mov ax, cs:[bx]

这些出现在访问内存单元的指令中,用于显式的指明内存单元的段地址,例如 ds:, cs:, ss:, es: 被称为段前缀。