指令
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 寄存器中。
步骤:
- CX = CX - 1
- 判断 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指令执行

浙公网安备 33010602011771号