指令

Debug和masm对指令的不同处理

在Debug中执行类似这样的指令:

mov ax,[0]

表示将ds:0处的数据送入ax中

但是在汇编程序中,指令“mov ax,[0]”被编译器当做指令“mov ax,0”处理

在源程序中如果要将 [] 内的数据当做地址来处理,要在 [] 的前面显式地给出段地址所在的段寄存器,比如将上面的 mov ax,[0] 改为 mov ax,ds:[0]

 

and 和 or

按位与,按位或,结果赋给按位运算的寄存器,如:

and al, 11110000  把 al 寄存器的值与 11110000 相与后的结果赋给al

 

mul乘法指令 

1.乘数:两个相乘的数,要么都是8位,要么都是16位。如果是8位,一个默认放在AL中,另一个放在8位reg或内存字节单元中;如果是16位,一个默认放在AX中,另一个放在16位reg或内存字节单元中

2.结果:如果是8位乘数结果默认放在AX中;如果是16位乘法,结果高位默认放在DX中,低位放在AX中。

 

div除法指令

除数:有8位和16位两种,存放在一个寄存器或内存单元中

被除数:

  • 如果除数位8位,被除数则为16位,默认存放在AX中
  • 如果除数为16位,被除数则为32位,DX存放高16位,AX存放低16位

 结果:

  • 如果除数为8位,则商存在AL中,余数存在AH中
  • 如果除数为16位,则商存在AX中,余数存在DX中

 

div bl:表示除数为8位,存放在BL寄存器中

div byte ptr ds:[0]:表示除数为8位,存放在内存ds:[0]中

 

shl和shr指令

shl和shr是逻辑移位指令

shl是逻辑左移,功能:

1.将一个寄存器或内存单元向左移位

2.将最后移出的以为写入CF

3.最低位用0补充

shl  al,1  ;将al中的数据左移一位

shr是逻辑右移,功能:

1.将一个寄存器或内存单元向右移位

2.将最后移出的以为写入CF

3.最高位用0补充

 

定义数据的指令

db  define byte  定义字节类型数据

dw  define word  定义字型数据

dd  define dword  定义双字类型数据

 

dup:定义多个数据

db  3 dup (1)  相当于db  1,1,1,

db  3 dup (0,1,2)  相当于db  0,1,2,0,1,2,0,1,2

在汇编源程序中,数据不能以字母开头,否则要在前面加0。如:A0001h要写为0A0001h

 

转移指令

可以修改ip,或同时修改cs和ip的指令统称为转移指令

OFFSET 

取得标号出的偏移地址

code segment
start:     mov ax,stack
            mov ss,ax
            mov sp,128

            mov ax,OFFSET start

mov ax,OFFSET start那一行将start的偏移地址(0)赋给了ax。

 

JMP指令

1.依据位移进行转移

CPU在执行转移指令是并不需要转移的目的地址

jmp  short  标号(转到标号处执行指令)

这种格式实现的事段内短转移,它对IP的修改范围为 -128~127(8位补码),也就是向前转移最多128个字节,向后最多转移127个字节。“short”说明指令进行的是短转移。

jmp  near  ptr  标号

实现的也是段内短转移,范围为 -32768~32767(16位补码) 

2.转移目的地址在指令中

jmp  far  ptr  标号

实现的是段间转移,又称远转移

3.转移地址在寄存器中

jmp  16位reg

4.转移地址在内存中

jmp  word  ptr  内存单元地址(段内转移)

jmp  dword  ptr  内存单元地址(段间转移)

 

jcxz指令

jcxc指令为有条件转移指令,所有的有条件转移指令都是短转移在对引的机器码中包含的是转移的位移,而不是目的地址。

指令格式:jcxz  标号(如果(cx) = 0,转移到标号处执行)

当(cx) != 0 时,什么也不做(程序向下执行)

 

LOOP指令

用于循环(跳转),循环次数保存在 CX 寄存器中。

步骤:

  1. CX = CX - 1
  2. 判断 CX 中的值,不为 0 则跳转到指定地址继续执行,为 0 则执行下面的指令

注:CX先减一,再判断,所以如果把 CX 误设成了0,减一后变为FFFF,导致循环FFFF次。

 

 

ret和retf

ret 指令用栈中的数据,修改IP的内容,从而实现近转移

retf 指令用栈中的数据,修改CS和IP的内容,从而实现远转移

 

call指令

1.依据位移进行转移的call指令

call  标号(将当前的IP压栈后,转到标号处执行指令)

2.转移目的地址在指令中的call指令

call  far  ptr  标号

实现的是段间转移

3.转移地址在寄存器中的call指令

call  16位reg

4.转移地址在内存中的call指令

(1)call  word  ptr  内存单元地址

(2)call  word  ptr  内存单元地址

 

参数传递问题

可以用寄存器存储,将参数放到bx中,或将参数在内存中的首地址作为参数放在寄存器中传给子程序。

 

程序返回指令

mov ax,4c00H

int 21H

这两条指令所实现的功能就是程序返回

在denug时,int 21H要用P指令执行 

 

 

 

 

 

 

 

 

 

posted @ 2019-11-02 10:31  tianqibucuo  阅读(652)  评论(0)    收藏  举报