汇编语言常见指令.docx
《汇编语言常见指令.docx》由会员分享,可在线阅读,更多相关《汇编语言常见指令.docx(15页珍藏版)》请在冰点文库上搜索。
汇编语言常见指令
汇编语言常见指令
————————————————————————————————作者:
———————————————————————————————— 日期:
“PTR”操作符:
强制类型转换
MOVBYTE PTR[BX],20H
ﻩ;1B立即数20H送DS:
[BX]
MOVWORDPTR [BX], 20Hﻩ
ﻩ;立即数20H送DS:
[BX],
;00H送DS:
[BX+1]
2.LEA(LoadEffectiveAddress)
设:
变量X的偏移地址为1020H ,(BP)=0020H
执行指令后:
LEADX,X ﻩ
LEABX,[BP]
ﻩ
;执行后,(DX)= 1020H
; 执行后,(BX)= 0020H
3.地址传送指令LDS,LES
LDSﻩREG16, MEM ;从存储器取出4B,送入REG16和DS
LESﻩREG16,MEM;从存储器取出4B,送入REG16和ES
4. 符号扩展指令CBW,CWD
CBWﻩ;将AL寄存器内容符号位扩展到AH
CWD;将AX寄存器内容符号位扩展到DX
设:
(AX)=8060H,(DX)=1234H
执行下列指令后
CBW
ﻩ;(AX)= 0060H
设:
(AX)=8060H,(DX)=1234H
执行下列指令后
CWD
ﻩ;(DX)=0FFFFH,(AX)=8060H
5. 交换指令XCHG
例如,(AX)= 5678H
执行下面指令后
XCHGﻩAH, ALﻩ
;(AX)=7856H
6.换码指令XLAT
XLATﻩ;AL←DS:
[BX+AL]
表格的首地址事先存放在内存逻辑地址DS:
BX中,
AL的内容是相对于表格的位移量,
把对应内存的内容取出放在AL寄存器。
7. 逻辑运算符
SHR(右移)
SHL(左移)
AND(与)
OR(或)
XOR(异或)
NOT(取反
8.关系运算符
关系运算符用于两个数的比较,结果为“真(-1)”或“假(0)”
GT(>)
GE(>=)
LT(<)
LE(<=)
EQ(=)
NE(≠)
9.地址运算符
SEG 名称 取地址表达式所在段的段基址
OFFSET 名称取地址表达式的偏移地址
10.类型操作符
TYPE:
取每个变量的字节数
LENGTH:
取变量定义了多少个
SIZE:
取变量占用的字节总数
11. 加法指令
(1)ADD(Addition):
加法指令
格式:
ADD dest,src
功能:
dest ←dest+src
dest(目的操作数):
8/16位的寄存器/存储器操作数
src(源操作数):
与目的操作数同类型的寄存器/存储器/立即数
例:
ADDAX, SI ;AX←(AX)+(SI),16位运算
ADDﻩX,3ﻩ ; X←(X)+3,运算位数由X的类型确定
ﻩﻩADD[BX],DX ; DS:
[BX]←DS:
[BX]+DX,16位运算
说明:
•状态标志CF,OF, ZF,SF,PF,AF按照运算结果被刷新;
(2)ADC(AdditionwithCarry):
带进位的加法指令
格式:
ADCdest,src
功能:
dest←dest+src+CF
dest(目的操作数):
8/16位的寄存器/存储器
src(源操作数):
与目的操作数同类型的寄存器/存储器/立即数
说明:
•状态标志CF,OF, ZF,SF,PF, AF按照运算结果被刷新;
•主要用于对数据分段相加时高位的加法运算。
(3)INC(Increment):
加一指令
格式:
INCﻩ dest
功能:
dest←dest+1
dest(目的操作数):
8/16位的寄存器/存储器
例:
ﻩﻩINCﻩX
ﻩﻩﻩ;X←(X)+1,运算位数由X的类型确定
INCﻩWORD PTR [BX]
;DS:
[ BX]←DS:
[BX]+1,16位运算
说明:
•会影响标志OF,ZF,SF,PF, AF,但是CF标志不受影响;
•增量指令常常用来修改计数器和存储器指针的值。
12. 减法指令
(1)SUB(Subtract):
减法指令
格式:
SUBﻩ dest,src
功能:
dest← dest-src
dest(目的操作数):
8/16位的寄存器/存储器
src(源操作数):
与目的操作数同类型的寄存器/存储器/立即数
例:
SUB Y,20H ;Y←(Y)-20H,运算位数由Y的类型确定
SUBWORD PTR[BP],5ﻩ
ﻩﻩﻩ;SS:
[BP] ←SS:
[BP]-5,16位运算
说明:
会影响CF, OF, ZF, SF,PF,AF标志位。
(2)SBB(SubtractwithBorrow):
带借位的减法指令
格式:
SBBﻩdest,src
功能:
dest←dest-src-CF
dest(目的操作数):
8/16位的寄存器/存储器
src(源操作数):
与dest同类型的寄存器/存储器/立即数
说明:
•会影响CF,OF,ZF,SF,PF,AF标志位;
•主要用于对一个数据分段相减时高位的减法运算
(3)DEC(Decrement):
减一指令
格式:
DECﻩ dest
功能:
dest←dest-1
dest(目的操作数):
8/16位的寄存器/存储器
例:
DEC CX;CX←(CX)-1,16位运算
DECXﻩﻩ;X←(X)-1,运算位数由X的类型确定
说明:
•会影响标志OF, ZF, SF,PF,AF,但是CF标志不受影响;
•减量指令常常用来修改计数器和存储器指针的值。
(4)NEG(Negate):
求补指令(求相反数)
格式:
NEGﻩ dest
功能:
dest←0-dest
dest(目的操作数):
8/16位的寄存器/存储器
例:
ﻩNEG Z ;Z←-Z,运算位数由Z的类型确定
说明:
会影响标志OF, ZF,SF, PF,AF, CF
13.乘法指令
(1)MUL(UnsignedMultiplication):
无符号数乘法
格式:
MUL src
src(源操作数):
8位/16位的寄存器/存储器
功能:
8位源操作数时:
AX←(AL)×源操作数
16位源操作数时:
DX, AX←(AX)×源操作数
说明:
•两个N位操作数相乘,得到2N位的乘积;
•如果乘积的高N位为0,则CF=OF=0,否则CF=OF=1。
其余
标志位无意义。
•上述说明中N=8或16。
(2)IMUL(Signed IntegerMultiplication):
有符号数乘法
格式:
IMUL src
src(源操作数):
8位/16位的寄存器/存储器
功能:
8位源操作数时:
AX←(AL)×源操作数
16位源操作数时:
DX, AX←(AX)×源操作数
说明:
●两个N位操作数相乘,得到2N位的乘积;
●如果乘积高N位为低N位的符号扩展,则CF=OF=0,否则ﻫ CF=OF=1,其余标志位无意义。
●上述说明中N=8或16。
14.除法指令:
DIV(UnsignedDivision):
无符号除法
格式:
DIVsrc
src(源操作数):
8位/16位的寄存器/存储器
功能:
8位源操作数时:
(AX)÷源操作数,AL←商,AH←余数
16位源操作数时:
(DX,AX)÷源操作数,AX←商,DX←余数
说明:
ﻩﻩﻩ
•两个N位操作数相除,应首先把被除数零扩展为2N位;
例如,要进行除法(AX)÷(BX),假设AX、BX内均为无符号数:
MOVﻩDX,0ﻩ;32位被除数高16位清零
ﻩDIVBX;(DX,AX)÷BX,AX←商,DX←余数
•如果(2N位)÷(N位)的商大于2N-1,会产生“除法溢出”错误。
•上述说明中N=8或16。
IDIV(SignedIntegerDivision):
有符号数除法
格式:
IDIVﻩsrc
src(源操作数):
8位/16位的寄存器/存储器
功能:
8位源操作数时:
(AX)÷源操作数,AL←商,AH←余数
16位源操作数时:
(DX,AX) ÷源操作数,AX←商,DX←余数
15.基本循环指令
格式:
LOOPﻩ标号
功能:
CX←(CX)-1
如果(CX)≠0,转向“标号”处执行,否则执行下一条指令。
说明:
•LOOP可以改变指令的执行次序,称为“控制转移指令”;
•LOOP指令使一段程序重复地执行,称为“循环”。
•重复执行的次数由CX寄存器中的值决定。
CX寄存器因此称为ﻫ “计数器”。
16.DEBUG.EXE常用命令
⏹反汇编
‘-U’ 、‘-U偏移地址’
⏹显示寄存器内容
‘-R ’、‘-R寄存器名’
⏹单步执行指令
‘-T’ 、 ‘-T指令条数’ 、‘-P’
⏹全速执行指令
‘-G ’ 、‘-G 终止地址’、 ‘-G=起始地址’
‘-G=起始地址终止地址’
⏹显示数据段内容
‘-D’、‘-D 起始地址’、 ‘-D起始地址L字节数’
⏹修改数据段内容
‘-E 起始地址 数据1 数据2 …’
‘-F 起始地址L字节数 数据1 数据2…’
⏹退出
‘-Q ’
17.移位指令
SHL 逻辑左移,最高位进入CF,最低位补0
SHR逻辑右移,最低位进入CF,最高位补0
SAL算术左移,最高位进入CF,最低位补0
SAR算术右移,最低位进入CF,最高位不变
18.循环移位指令
ROL不带进位循环左移
ROR 不带进位循环右移
RCL带进位循环左移
RCR带进位循环右移
18. 无条件转移指令
∙⑴段内转移、直接寻址
∙⑵段内转移、间接寻址
∙⑶段间转移、直接寻址
∙⑷段间转移、间接寻址
JMPlabel
⏹转到label指定的目标地址处,执行那里的指令
⏹目的地址label的位置有2种情形:
⏹和JMP指令在同一个段,叫做段内转移,转移时CPU只改变IP;
⏹和JMP指令不在同一个段,叫做段间转移,转移时CPU既要更改IP又要更改CS,
⏹目的地址label有两种表示方式:
⏹label是目标地址处指令的标号,叫做直接寻址
⏹label是寄存器或内存单元,跳转目的地址在寄存器或内存中,叫做间接寻址
19.比较测试指令
指令操作码
指令格式
功能描述
CMP
CMP dest,src
(dest)-(src),不存结果
TEST
TEST dest, src
(dest)∧(src),不存结果
目的操作数dest:
8位/16位的寄存器/存储器操作数。
源操作数src:
与dest同类型的寄存器/存储器/立即数。
功能:
运算后影响标志位,但不保留运算结果。
用途:
•CMP——比较两个数的大小关系,但不改变它们的值。
ØAX?
=BX
•TEST——判断目的操作数中个别二进制位,但不改变它的值。
Ø判断一个数的奇偶性
20.条件转移指令
Jxxlabel
“J”----Jump
“xx”是转移的条件
“label”只能为目标指令的标号。
都属于段内短转移。
操作码助记符
条件
指令功能
JZ/JE
ZF=1
相等或为0转移
JNZ/JNE
ZF=0
不相等或不为0转移
JS
SF=1
结果是负数,则转移
JNS
SF=0
结果不是负数,则转移
JO
OF=1
结果溢出,则转移
JNO
OF=0
结果没有溢出,则转移
JP/JPE
PF=1
低位字节有偶数个1,则转移
JNP/JPO
PF=0
低位字节有奇数个1,则转移
JB/JNAE/JC
CF=1
有进借位或<,则转移
JAE/JNB/JNC
CF=0
无进借位或≥,则转移
JBE/JNA
CF=1或ZF=1
≤,则转移
JA/JNBE
CF=0且ZF=0
>,则转移
JL/JNGE
SF≠OF
<,则转移
JGE/JNL
SF=OF
≥,则转移
JLE/JNG
SF≠OF或ZF=1
≤,则转移
JG/JNLE
SF=OF且ZF=0
>,则转移
JCXZ
CX=0
CX=0,则转移
21.调用指令
CALL(Call,调用)指令
•段内直接调用
ﻩ格式:
CALLﻩ子程序名
操作:
SP←SP-2,SS:
[SP]←IP(保存16位返回地址)
ﻩﻩIP←子程序入口的偏移地址
•段内间接调用
格式:
CALLREG16/MEM16
操作:
SP←SP-2, SS:
[SP]←IP(保护16位返回地址)
ﻩIP← REG16/MEM16
•段间直接调用
格式:
CALL FARPTR子程序名
操作:
ﻩSP←SP-2,SS:
[SP]←CS
ﻩSP←SP-2,SS:
[SP]←IP
(以上是保存32位返回地址,偏移地址保存在较小地址处)
IP←子程序入口的偏移地址,
ﻩCS←子程序入口的段基址
•段间间接调用
格式:
CALLﻩMEM32
操作:
SP←SP-2,SS:
[SP]←CS
SP←SP-2,SS:
[SP]← IP
ﻩIP←[MEM32],CS←[MEM32+2]
(1)ﻩCALLPROC1
(2) LEACX,PROC1
ﻩCALLﻩCX
(3)ADDR_PROC1DWPROC1 ;子程序偏移地址
ﻩ……
CALLﻩADDR_PROC1;调用近程子程序PROC1
(4)LEAﻩBX,ADDR_PROC1
CALLWORDPTR[BX]ﻩ;调用近程子程序PROC1
22.RET指令
⏹ 无参数段内返回
ﻩ格式:
RET
ﻩ操作:
IP← SS:
[SP],SP←SP+2
⏹有参数段内返回
ﻩﻩ格式:
RETD16 ﻩﻩ;其中D16代表16位数据
ﻩ操作:
IP← SS:
[SP],SP←SP+2
ﻩ SP← SP+D16
⏹无参数段间返回
ﻩ格式:
RET
操作:
IP←SS:
[SP], SP←SP+2
ﻩﻩﻩCS←SS:
[SP], SP←SP+2
⏹有参数段间返回
格式:
RET D16;其中D16代表16位数据
ﻩ操作:
ﻩIP←SS:
[SP],SP←SP+2
ﻩCS←SS:
[SP], SP←SP+2
ﻩSP←SP+D16
23.宏指令
宏定义
macro_name MACRO[哑元表];形参/虚参
[LOCAL标号表]
…… (宏定义体)
……
ENDM
*如果宏定义体内有一个或多个语句标号,则必须用LOCAL伪操作列出所有的语句标号。
宏调用
macro_name [实元表];实参
*实元表中的实元与哑元表中的哑元在位置上一一对应;
*若实元数>哑元数,则多余的实元无效;
*若实元数<哑元数,则多余的哑元作“空(NUL)”处理;
*对宏指令的调用必须先定义后调用。
宏定义独立于逻辑段。
宏展开
⏹把宏定义体复制到调用宏指令的位置上,同时用实元取代哑元,由LOCAL定义的标号也由?
?
0000~?
?
FFFF替代。