[BX]
假如我们要把一个内存单元的内容送入ax,这个内存单元的偏移地址是0,段地址存在ds寄存器当中,可以这样写:
mov ax,[0]
在上面,我们可以用[0]来表示一个内存单元
而要完整的描述一个内存单元,需要两种信息:
- 内存单元的地址
- 内存单元的长度(类型)
在上面的例子中:
[0]表示单元的偏移地址,段地址存在ds寄存器中;
而单元的长度(类型)可以由具体指令中的其他操作对象(比如说寄存器)指出(对于这一点,看下面的例子)
# 将偏移地址为0,段地址存在ds中的内存单元,长度为2个字节,送入ax中
mov ax,[0]
# 将偏移地址为0,段地址存在ds中的内存单元,长度为1个字节,送入al中
mov al,[0]
相应的,有[0]就可以有[1],也可以有[bx]这样的表现形式。
也就是将偏移地址送入到bx中,段地址默认存在ds中。
示例
有这么一个例子
# 设置ds的值
mov ax,2000H
mov ds,ax
# 偏移地址的值
mov bx,1000H
# 将 ds:[bx]所指向的内存单元的值送入ax中,长度为2个字节
# 此时ax中的值为00BE
# 对应【0】
mov ax,[bx]
# bx中的内容加1
inc bx
# bx中的内容加1
inc bx
# 将ax中的值送入ds:[bx]所指向的内存单元,长度为2个字节
# 对应【1】
mov [bx],ax
# bx中的内容加1
inc bx
# bx中的内容加1
inc bx
# 将ax中的值送入 ds:[bx]所指向的内存单元,长度为2个字节
# 对应【2】
mov [bx],ax
# bx中的内容加1
inc bx
# 将al中的值送入 ds:[bx]所指向的内存单元,长度为1个字节
# 对应【3】
mov [bx],al
# bx中的内容加1
inc bx
# 将al中的值送入 ds:[bx]所指向的内存单元,长度为1个字节
# 对应【4】
mov [bx],al
表格中黄色部分代表ds:[bx]所指向的内存单元
地址 | 【0】 | 【1】 | 【2】 | 【3】 | 【4】 |
---|---|---|---|---|---|
21000H | BE | BE | BE | BE | BE |
21001H | 00 | 00 | 00 | 00 | BE |
21002H | BE | BE | BE | BE | |
21003H | 00 | 00 | 00 | 00 | |
21004H | BE | BE | BE | ||
21005H | 00 | BE | BE | ||
21006H | BE | ||||
21007H |
loop
我们在Java中都学过for循环
for(int i=10;i>0;i--){
...
}
在汇编中,我们也可以使用loop指令来实现同样的功能
loop值指令的格式是
loop 标号
cx中存放的就是循环的次数
CPU在执行loop指令的时候,分两步操作
- 让cx中的值-1
- 判断cx中的值是否为0,不为0转至标号处执行程序;为0则向下执行
注意是先让cx中的值-1,再进行判断
示例
计算2^10
assume cs:code
code segment
mov ax,2
mov cx,9
# 这里的s就是标号
s: add ax,ax
loop s
mov ax,4c00h
int 21h
code ends
end
过程
执行mov ax,2
,这里用(ax)代表ax中的值,(cx)同理
计算2^10=(ax)*2*2*2*2*2*2*2*2*2
执行mov cx,9
,将cx中的值设置为9
执行add ax,ax
(第一次)
执行loop s
让(cx)减1,(cx)=8,不等于0,所以转至s处;
执行add ax,ax
(第二次)
执行loop s
让(cx)减1,(cx)=7,不等于0,所以转至s处;
执行add ax,ax
(第三次)
执行loop s
让(cx)减1,(cx)=6,不等于0,所以转至s处;
执行add ax,ax
(第四次)
执行loop s
让(cx)减1,(cx)=5,不等于0,所以转至s处;
执行add ax,ax
(第五次)
执行loop s
让(cx)减1,(cx)=4,不等于0,所以转至s处;
执行add ax,ax
(第六次)
执行loop s
让(cx)减1,(cx)=3,不等于0,所以转至s处;
执行add ax,ax
(第七次)
执行loop s
让(cx)减1,(cx)=2,不等于0,所以转至s处;
执行add ax,ax
(第八次)
执行loop s
让(cx)减1,(cx)=1,不等于0,所以转至s处;
执行add ax,ax
(第九次)
执行loop s
让(cx)减1,(cx)=0,等于0,继续向下执行(结束循环);
mov ax,4c00h int 21h
暂时理解成程序返回