前言:
[bx]和loop指令
目录:
[bx]指令:
[bx] 和 [0] 有些类似,[0] 表示内存单元,它的偏移地址是 0
比如:
mov ax,[0]
将一个内存单元的内容送入 ax ,这个内存单元的长度为 2字节(字单元),
存放一个字节,偏移地址为 0 ,地址段在 ds 中
mov a1,[0]
将一个内存单元的内容送入 a1 ,这个内存单元的长度为 1字节(字单元),
存放一个字节,偏移地址为 0 ,地址段在 ds 中,其中 a1 是字符串,只传送一个字节。
在编译器中 mov ax,[0] 指令会被编译器认为是 mov ax,0 所以引入 [bx] 的概念
mov [bx],ax 表示 (ds)*16+(bx)
=ax
用法和之前的ds[address]一样
[bx] 的使用方法:
mov ax,1000H
mov bx,2000H
mov ds,ax ; 将ds数据段寄存器赋值为2000H
mov [bx],ax ; 将ax寄存器的值赋给内存单元21000H位置
其他方式:
mov ax,ds:[0] ; 将内存单元20000H位置的值赋给ax
loop指令:
loop 是循环指令
指令的格式是:loop 标号,
CPU 执行 loop 指令的时候,要进行两步操作:
① (cx)=(cx)-1;
② 判断cx中的值,不为零则转至标号处执行程序,如果为零则向下执行。
通常我们用loop指令来实现循环功能,cx 中存放循环次数。
例如:编程计算 2^2,结果存在 ax 中
分析: 设 ax=2,可计算 ax=(ax)*2
,最后 ax 中为 2^2的值,
N*2
可用 N+N 实现
程序如下:
assume cs:code
code segment
mov ax,2
add ax,ax
mov ax,4c00h ; 程序返回
int 21h
code ends ; 代码段结束
end
假如计算 2^12,则需要写 11 条重复的指令 add ax,ax
显然我们不希望这样来写,
这时,我们可以用 loop 来做
比如:
assume cs:code
code segment
start:mov ax,2
mov cx,11 ; 设定循环次数为11
s: add ax,ax ; 每次循环执行的操作,每次执行的时候使cx-1
loop s ; 验证cx的值是否为0,为0执行下面的程序,否则跳回s(s可以为任意字符串)执行
mov ax,4c00h ; 程序返回
int 21h
code ends ; 代码段结束
end start
总结:
[bx] 和 loop 指令。