前言
为了方便理解,我们先来理解一些描述性符号
- “()”表示一个寄存器或一个内存单元中的内容,“()”中的元素可以有三种类型:寄存器名、段寄存器名、内存单元的物理地址
- 符号idata表示常量
(X)所表示的数据可以有两种类型:字节和字,数据类型由寄存器名或具体的运算决定
(al)(bl)(cl)等得到的数据为字节型(ds)(ax)(bx)等得到的数据为字形
(al)=(20000H),则(20000H)得到的数据为字节型;(ax)=(20000H),则(20000H)得到的数据为字型
(ax)表示ax中的内容、(al)表示al中的内容
(ax)、(ds)、(al)、(cx)、(20000H)、((ds)*16+(bx))正确写法
(2000:0)、((ds):1000H)错误写法
mov ax,[idata]就代表mov ax,[1]、mov ax,[2]、mov ax,[3]等
mov ax,idata就代表mov ax,1、mov ax,2、mov ax,3等
[bx]
[bx]代表段寄存器内存单元,它和[0]都代表的是一个内存单元,只不过[0]的偏移地址为0而,[bx]的偏移地址在bx中
bx中存放的数据作为一个偏移地址EA,段地址SA默认在ds中
Loop指令
loop指令的格式是:loop 标号,CPU执行loop指令的时候,要进行两步操作;
- (cx) = (cx) - 1
- 判断cx中的值
cx的值不为零则跳转到标号处执行程序,如果为零则向下执行
用途:loop指令我们一般用来实现循环功能,cx存放循环次数
案例:计算2的十二次方
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
Debug和汇编编译器masm对指令的不同处理
Debug和编译器masm对形如“mov ax,[0]”这类指令有解释上的不同。这些指令中的[idata]在Debug中解释为一个内存单元,而编译器解释为一个数idata
那我们需要在编译器将[idata]解释为一个内存单元需要在它之前显式的给出段地址所在的段寄存器,比如我们可以这样访问2000:0单元
mov ax,2000h
mov ds,ax
mov al,ds:[0]