两种指令[BX]和loop指令
下面将知识点总结如下:
一、先介绍描述性符号()
(ax)(al)(20000H)
((ds)*16+(bx))
()中的元素可以有三种类型:
1.寄存器名 2.段寄存器名 3.内存单元的物理地址(20位数据)
举例(X)应用:
1.ax内容为0010H,(ax)=0010H
2.2000:1000内容为0010,(21000H)=0010H
3.指令 mov ax,[2],(ax)=((ds)*16+2)
4.push ax:
(sp)=(sp)-2
((ss)*16+(sp))=(ax)
5.pop ax:
(ax)=((ss)*16+(sp))
(sp)=(sp)+2
(X)中可表示字或者字节,具体看寄存器而定
如:
(al)=(20000H)得到数据字节型
(ax)=(20000H)得到数据字型
二、mov ax,[idata] 中的idata为常量
三、inc bx 为bx内容加1
三、类似于
mov ax,[0]
mov al,[0]
实现
mov ax,[bx]
mov al,[bx]
[bx]也表示一个内存单元,也可以将内存单元送入ax
四、loop为循环指令,CPU执行loop时:
1.(cx)=(cx)-1;
2.判断cx的值,不为零转至标号处执行程序,如果为零向下执行
如程序:
assume cs:code
code segment
mov ax,2
mov cx,11
s:add ax,ax
loop s
mov ax,4c00h
int 21h
code ends
end
五、将字节单元中数据8位给16位寄存器ax,如设ffff:0006单元数据为XXh时,如下指令:
mov ax,offffh
mov ds,ax
mov bx,6
mov al,[bx]
mov ah,0
即设置(al)=((ds*16)+(bx)),(ah)=0
汇编程序中数据不能以字母开头,所以要在前面加0
六、g命令可跳转执行代码,如:
-g 0012为执行到0012内存单元所对应的汇编程序,可用来跳转过多的loop循环
同时,当执行到loop命令时也可用p命令直接执行循环loop完毕
七、对于同一个汇编指令mov ax,[0]
在debug中为内存单元的移动
而源程序中将[idata]视为idata数据的移动
解决方法:
1.将偏移地址送入寄存器访问内存单元
mov ax,2000h
mov ds,ax
mov bx,0
mov al,[bx]
2.在[ ]前显示声明段地址所在段寄存器
mov ax,2000h
mov ds,ax
mov al,ds:[0]
八、用:
s:mov al,[bx]
mov ah,0
add dx,ax
inc bx
loop s
来不写新的命令,从而仅通过改变bx中的数值,改变指令访问的内存单元
九、DOS和其他合法的程序一般都不会使用0:200~0:2ff(00200h~002ffh)的256个空间
十、用
s:mov dl,[bx]
mov es:[bx],dl
inc bx
loop s
中使用es寄存器当类似ds寄存器,将两处内存单元的值复制,即是段前缀的使用
原文地址:https://www.cnblogs.com/msag/p/9912325.html