汇编语言第五章总结

两种指令[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寄存器,将两处内存单元的值复制,即是段前缀的使用

猜你喜欢

转载自www.cnblogs.com/msag/p/9912325.html