[bx]
assume cs:code
code segment
start: mov ax, 2000H
mov ds, ax
mov al, [0]
mov bl, [1]
mov cl, [2]
mov dl, [3]
mov ax, 4c00H
int 21H
code ends
end start
[bx]是什么?
[bx] 它表示一个内存单元,跟 [0] 一样,它的偏移地址在[bx]中
[bx] 与 [0] 的区别:
mov ax, [0]:在编译器中运行时,会当做 mov ax,0来执行,而使用 mov ax, [bx]会获取偏移地址为0出的内存单元的数据
mov ax, [bx]
描述性符号:“()”,具体应用如下:
()
只是为了描述所用,在真实开发中不能这样使用。
- ax中的内容为 0010H,我们可以这样描述:
(ax)=0010H
- 2000:1000出的内容为 0010H,我们可以着这样描述:
(21000H)=0010H
,括号中的地址即为物理地址(内容) - 对于 mov ax,[2],我们可以这样描述:
(ax)=( (ds)*16+2)
- 对于 mov [2]. ax,我们可以这样描述:
( (ds)*16+2)=(ax)
- add ax,2:
(ax)=(ax)+2
- add ax,bx:
(ax)=(ax)+(bx)
- push ax:
(sp)=(sp)-2
((ss)*16+(sp))=(ax)
- pop ax
((ss)*16+(sp))=(ax)
(sp)=(sp)+2
- idata,表示常量
[bx]
mov ax, [bx]
功能:将bx中存放的数据作为一个偏移地址 EA·段内地址SA默认在ds中,将SA:EA处的数据送入ax中。
即 (ax) = (ds*16+(bx))
loop指令
计算 2^3。
; 使用loop计算 2^3
assume cs:code
code segment
start: mov ax, 2
; 这里循环执行 2+2的操作,cx中存放循环的次数,s为标号,可自己指定
mov cx, 3
s: add ax,ax
loop s
; 循环结束
mov ax, 4c00H
int 21H
code ends
end start
解析:
- 上面的标号 s,表示的是一个地址,这个地址上有一条指令:add ax, ax
-
loop s
执行步骤:- (cx)=(cx)-1
- 判断
cx
中的值是否为0,如果为0则执行下一步(退出循环),否则执行循环中的指令即add ax,ax
基本框架
mov cx, 循环次数
s:
循环体
loop s
案例
用加法计算 123*126, 结构存在ax中;
assume cs:code
code segment
start: mov ax,0
mov cx, 126
s: add ax,123
loop s
mov ax, 4c00H
int 21H
code ends
end start
调试时,我们可以使用p
命令跳出循环。
计算ffff:0006单元中的数乘以3,将结果存放在dx中。
; 计算ffff:0006单元中的数乘以3,将结果存放在dx中
assume cs:code
code segment
start: mov ax, 0ffffH ; [0]为什么是 0ffffH
mov ds, ax
mov bx, 6,
mov al, [bx]
mov ah, 0 ;[1]以上两句可以改成 mov ax, [bx]吗?
mov dx, 0
mov cx,3
s: add dx, ax
loop s
mov ax, 4c00H
int 21H
code ends
end start
解析:
- [0]:大于
9FFFF
的十六进制的数有很多,如A0000H....,在汇编语言中不能以字母开头,所以在前面加上0
- [1]:可以,能够通过编译