第五章 [BX]和Loop指令
1.1 [BX]
功能代码
mov ax,[bx]
功能:bx中存放的数据作为一个偏移地址EA,段地址SA默认在ds中,将SA:EA处的数据
送入ax中。
inc bx
表示bx = bx + 1
Loop指令
Loop指令,用于循环,CPU在进行Loop的时候,要进行两步操作
- (cx) = (cx) - 1
- 判断cx 中的值,如果不为零,则跳转到标记处执行程序,如果为0则继续往下执行
例如
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
首次每次执行到loops的时候,cx = cx - 1, cx = 10 ,cx 不为0,则跳转到标记 s
再次执行 add ax,ax
,直到cx == 0
上面代码add ax, ax
执行了11次 cx == 0继续向下执行,跳出循环。结束
5.3 在Debug中跟踪loop实现的循环程序
在汇编程序中,数据不能以字母开头,所以
ac00h
数据要写成0ac00h
假设汇编文件已经生成
test.exe
执行文件
使用debug test.exe
来调试
debug中调试loop的两个命令
- 可以使用
g
命令来直接到达代码某处 例如g 0016
会使代码直接运行到CS:0016
处 - 在循环中,使用
p
命令 ,会直接自动重复指令循环的指令,直到(cx) = 0
5.4Debug和汇编编译器masm对指令的不同处理
mov ax 2000
mov ds, ax
mov al ,[0]
mov al ,[1]
mov al ,[2]
debug 中mov al ,[2]
中的[2]为 ds:[2]
masm中 中 mov al ,[2]
为mov al, 2
, 如果想要在masm中和debug中一样,需要显式的表示 如:mov al ,ds:[2]
或者如下所示
mov ax 2000
mov ds, ax
mov bx, 0
mov al,[bx]
5.5 loop和[bx]的联合应用
可以在loop中更改bx的值,这样就可以循环读取/写入数据了, 再利用cx
设置执行的次数
5.6 段前缀
mov ax, ds:[bx]
mov ax, cs:[bx]
mov ax, ss:[bx]
mov ax, es:[bx]
mov ax, ss:[bx]
mov ax, cs:[bx]
这些出现在访问内存单元的指令中,用于显式的指名内存单元的段地址的,在汇编语言中成为段前缀
5.7 一段安全的空间
- 我们需要直接的向一段内存中写入内容
- 这段内存空间不应该存放系统或者其他程序的数据或者代码
- DOS方式下,一般情况。
0:200~0:2ff
空间没有系统或者其他程序的数据或者代码 - 以后,我们需要只写向一段内存中写入内容中,就使用
0:200~0:2ff
这段空间
5.8 段前缀的使用
可以通过段前缀操作多个段,通过[adress]去修改