从0学习汇编语言(5)[BX]和Loop指令

238 阅读2分钟

《从0学习汇编语言目录》

第五章 [BX]和Loop指令

1.1 [BX]

功能代码

mov ax,[bx]

功能:bx中存放的数据作为一个偏移地址EA,段地址SA默认在ds中,将SA:EA处的数据送入ax中。

inc bx 表示bx = bx + 1

Loop指令

Loop指令,用于循环,CPU在进行Loop的时候,要进行两步操作

  1. (cx) = (cx) - 1
  2. 判断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的两个命令
  1. 可以使用 g命令来直接到达代码某处 例如 g 0016会使代码直接运行到CS:0016
  2. 在循环中,使用 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 一段安全的空间

  1. 我们需要直接的向一段内存中写入内容
  2. 这段内存空间不应该存放系统或者其他程序的数据或者代码
  3. DOS方式下,一般情况。0:200~0:2ff空间没有系统或者其他程序的数据或者代码
  4. 以后,我们需要只写向一段内存中写入内容中,就使用0:200~0:2ff这段空间

5.8 段前缀的使用

可以通过段前缀操作多个段,通过[adress]去修改

《第六章 包含多个段的程序》