小白的汇编之路(五)----[BX]和loop指令

[BX]

假如我们要把一个内存单元的内容送入ax,这个内存单元的偏移地址是0,段地址存在ds寄存器当中,可以这样写:

mov ax,[0]

在上面,我们可以用[0]来表示一个内存单元
而要完整的描述一个内存单元,需要两种信息:

  1. 内存单元的地址
  2. 内存单元的长度(类型)

在上面的例子中:
[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】
21000HBEBEBEBEBE
21001H00000000BE
21002HBEBEBEBE
21003H00000000
21004HBEBEBE
21005H00BEBE
21006HBE
21007H

loop

我们在Java中都学过for循环

for(int i=10;i>0;i--){
	...
}

在汇编中,我们也可以使用loop指令来实现同样的功能
loop值指令的格式是

loop 标号

cx中存放的就是循环的次数
CPU在执行loop指令的时候,分两步操作

  1. 让cx中的值-1
  2. 判断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暂时理解成程序返回

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值