前言
参考书籍:
王爽。汇编语言。北京:清华大学出版社, 2013:95-121
本人菜狗一枚,不敢咬文嚼字,只能站在巨人的肩膀上窥探一下未曾了解的世界。
[BX]
要完整地描述一个内存单元,需要两种信息:
- 内存单元的地址(段地址默认在 ds 中)
- 内存单元的长度(类型)(由具体指令中的其他操作对象(如寄存器)指出)
和 [0] 一样,[bx] 也表示一个内存单元,它的偏移地址在 bx 中。
; 段地址 SA 默认在 ds 中
; bx 中存放的数据作为一个偏移地址 EA
mov ax, [bx] ; 将 SA:EA 处的数据送入 ax 中, 即 (ax) = ((ds) * 16 + (bx))
mov [bx], ax ; 将 ax 中的数据送入内存 SA:EA 处, 即 ((ds) * 16 + (bx)) = (ax)
汇编指令 | 数据变化 | 语法描述 |
---|---|---|
mov al, [0] | (al) = 0 | 将常量 0 送入 al 中(与 mov al, 0 含义相同) |
mov al, ds:[0] | (al) = ((ds) * 16 + 0) | 将内存单元中的数据送入 al 中 |
mov al, [bx] | (al) = ((ds) * 16 + (bx)) | 将内存单元中的数据送入 al 中 |
mov al, ds[bx] | (al) = ((ds) * 16 + (bx)) | 将内存单元中的数据送入 al 中 |
指令访问内存单元,必须使用 […] 表示内存单元
- [常量]:若用常量直接给出内存单元的偏移地址,则要在 [] 的前面显式地给出段地址所在寄存器
- [寄存器],若用寄存器间接给出内存地址的偏移地址,则段地址默认在 ds 中(显式隐式都可)
在访问内存单元时,用于显式地指明内存单元的段地址的 ds:(默认)、cs:、ss:、es:,被称为段前缀
loop 循环指令
loop 指令的格式:loop 标号
CPU 执行 loop 指令的时候,要进行两步操作:
- (cx) = (cx) - 1
- 判断 cx 中的值(为零则向下执行)(不为零则转至标号处执行程序)
通常使用 loop 指令来实现循环功能,cx 中存放循环次数。
assume cs:code
code segment
mov ax, 2
; cx 为循环次数
; s 标号内为循环体
mov cx, 11
s: add ax, ax
loop s
mov ax, 4c00h
int 21h
code ends
end
安全空间
在不能确定一段内存空间中是否存放着重要的数据或代码的时候,不能随意向其中写入内容。
安全空间:0:200 ~ 0:2ff(谨慎起见,在使用前用 Debug 查看一下)。
DOS 和其他合法的程序一般不会使用 0:200 ~ 0:2ff 的 256 个字节的空间。