汇编语言常见指令
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
汇编语言常见指令
汇编语言常见指令
“PTR”操作符:强制类型转换
MOV BYTE PTR [BX], 20H
;1B立即数20H送DS:[BX]
MOV WORD PTR [BX], 20H
;立即数20H送DS:[BX],
;00H送DS:[BX+1]
2.LEA(Load Effective Address)
设:变量X的偏移地址为1020H , (BP)=0020H 执行指令后:
LEA DX, X
LEA BX, [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 A H, 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:
取变量定义了多少个
取变量占用的字节总数
11.加法指令
(1)ADD(Addition):加法指令
格式:ADD dest,src
功能:dest ←dest + src
dest(目的操作数):8/16位的寄存器/存储器操作数
src(源操作数):与目的操作数同类型的寄存器/存储器/立即数
例:A DD AX, 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(Addition with Carry):带进位的加法指令
格式:ADC dest,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的类型确定
SUB WORD PTR [BP], 5
;SS:[ BP] ←SS:[ BP]-5,16位运算
说明:会影响CF, OF, ZF, SF, PF, AF 标志位。
(2)SBB (Subtract with Borrow):带借位的减法指令
格式: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位运算
DEC X ;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(Unsigned Multiplication):无符号数乘法
格式: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 Integer Multiplication):有符号数乘法格式: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(Unsigned Division):无符号除法
格式:DIV src
src(源操作数):8位/16位的寄存器/存储器
功能:8位源操作数时: (AX)÷源操作数,AL←商,AH←余数16位源操作数时:(DX, AX)÷源操作数,AX←商,DX←余数
说明:
两个N位操作数相除,应首先把被除数零扩展为2N位;
例如,要进行除法(AX)÷(BX),假设AX、BX内均为无符号数:MOV DX, 0 ;32位被除数高16位清零
DIV BX ;(DX, AX)÷BX,AX←商,DX←余数
如果(2N位)÷(N位)的商大于2N-1,会产生“除法溢出”错误。
上述说明中N=8或16。
IDIV(Signed Integer Division):有符号数除法
格式: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.无条件转移指令
⑴段内转移、直接寻址
⑵段内转移、间接寻址
⑶段间转移、直接寻址
⑷段间转移、间接寻址
JMP label
转到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.条件转移指令
Jxx label
“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 ← 子程序入口的偏移地址
段内间接调用
格式:CALL REG16/MEM16
操作:SP← SP-2,SS:[SP] ← IP(保护16位返回地址)
IP ← REG16/MEM16
段间直接调用
格式:CALL FAR PTR 子程序名
操作: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)CALL P ROC1
(2)LEA CX, PROC1
CALL CX
(3) ADDR_PROC1 DW PROC1 ;子程序偏移地址
……
CALL A DDR_PROC1 ;调用近程子程序PROC1 (4)LEA BX, ADDR_PROC1
CALL W ORD PTR [BX] ;调用近程子程序PROC1
22.RET指令
无参数段内返回
格式:RET
操作:IP← SS: [SP],SP ← SP+2
有参数段内返回
格式:RET D16 ;其中D16代表16位数据。