[BX]和loop指令
文章目录
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/2775d5bad691dc5880682dc1e7d134f5.png)
[BX]
就是间接寻址。
[0] 表示 偏移地址为0
[BX] 表示内存的偏移地址 存放在BX寄存器中。
mov ax, [bx] # (ax) = ((ds)*16+(bx))
有一点需要说明:
在源程序中使用 mov ax, [0]
会被MASM编译器 编译成move ax,0
, 所以不得不借助于bx寄存器。
mov bx,0
mov ax, [bx]
Loop指令
loop标号:
- (cx) = (cx)-1
- 如果cx==0, 向下执行,否则跳转到标号处执行。
简而言之 就是实现 循环(cx)次 标号处的命令。
在Debug中跟踪用loop指令实现的循环程序。
在源程序中 数字不能以字母开头。
所以B001H
得写成0B001H
使用g
可以执行到指定的代码处。
使用p
可以执行完循环体。
Debug和汇编编译器masm对指令的不同处理
略,
就是debug中可以用mov ax,[0]
同样的指令在masm会编译成mov ax, 0
在源代码中实现类似的功能,有两种方法:
# 间接寻址
mov bx,0
mov ax,[bx]
# 直接寻址
mov ax, ds:[0]
loop和[bx]的联合应用
略,就是个举例。
段前缀
默认的段地址存放在ds
中,
程序也可以指定 具体的寄存器。如mov ax, es:[bx]
, 这个就是 (ax) = ((es)*16+(bx))
这个出现在访问内存单元的指令中,用于显示地指明内存单元的段地址的"es", 在汇编语言中称为 段前缀。
一段安全的空间
dos环境下(实模式),可以绕过操作系统,直接对任意的内存写数据,而改写的内存可能存放的系统数据,其他程序的数据。会引发异常,安全的编程就是只能在系统分配的内存空间范围内操作。
在windows2000,unix等运行于cpu保护模式下的系统,汇编语言已经无法直接操作硬件。
dos方式下,一般不会使用0:200~0:2ff 的256个字节的空间,使用前可以先看看数据是不是都是0,都是0就表示是安全的。
段前缀的使用
略。