Loop指令和[BX]
1、loop指令格式:loop 标号
(在汇编语言中,标号代表一个地址)
2、CPU执行loop指令的时候要进行俩步操作:
- (cx)=(cx)-1
- 判断cx中的值,不为零则转至标号处执行程序,如果为零则向下执行
3、 cx和loop指令相配合实现循环:
- 在cx中存放循环次数
- loop指令中的标号所标识的地址要在前面
- 要循环执行的程序段,要写在标号和loop指令的中间
mov cx,循环次数
s:
循环执行的程序段
loop s
4、 大于9FFFh的16进制的数据,在书写的时候都是以字母开头的,而在汇编源程序中,数据不能以字母开头,所以要在前面加零。因此ffffh
要写成了0ffffh
5、Debug和汇编编译器masm对指令有不同的处理
(1)在汇编源程序中,如果用指令访问一个内存单元,则在指令中必须用[...]
来表示内存单元,如果[]
里用一个常量idata直接给出内存单元的偏移地址,就要在[]
的前面显示的给出段地址所在的段寄存器。
mov ax,ds:[idata] ;data是一个常量
如果没有在[]
的前面显示的给出段地址所在的段寄存器,那么编译器masm将把指令中的[idata]
解释为idata
。
mov ax,[idata] ;data是一个常量
(2)如果在[]
里用寄存器,间接的给出内存单元的偏移地址,则段地址默认在ds中。
6、关于俩个运算对象类型不匹配和结果可能超界的情况:
(1)(dx)=(dx)+内存中的8位数据
(2)(dl)=(dl)+内存中的8位数据
assume cs:code
code segment
mov ax,0ffffh
mov ds,ax ;(ds)=ffffh
mov ax,0020h
mov es,ax ;(es)=0020h
mov bx,0 ;(bx)=0,此时ds:bx=ffff:0,es:bx=0020:0
mov cx,12 ;循环12次
s: mov dl,[bx] ;将ds:bx的数据送入dl
mov es:[bx],dl ;将dl中的数据送入es:bx
inc bx ;(bx)=(bx)=1
loop s
mov ax,4c00h
int 21h ;程序返回
code ends
end