关于汇编语言 百度百科-汇编语言
汇编语言作为最接近底层的,人类能够读懂的语言,在计算机快速发展的时代里,同样能够发挥许多作用。相比高级语言,拥有着更高的效率,在逆向方面,软件安全防护方面,发挥着重要的作用。
汇编基础知识(概念):
指令——控制计算机完成指定操作的命令
机器指令——指令的二进制代码形式。例如:CD21H
汇编指令——助记符形式的指令。例如:INT 21H
指令系统——CPU所有指令及其使用规则的集合
指令按功能分为六大类
(1)数据传送类;
(2)算术运算类;
(3)逻辑运算和移位;
(4)串操作;
(5)控制转移类;
(6)处理器控制。
指令的基本构成: 操作码 [操作数] [操作数](指令由操作码和操作数组成)
常用指令:
指令类型 |
助记符 |
|
数 据 传 送 |
数据传送 |
MOV,PUSH/POP,XCHG等 |
地址传送 |
LEA,LDS,LES |
|
输入输出 |
IN,OUT |
|
算 术 运 算 |
加法 |
ADD,ADC,INC |
减法 |
SUB,SBB,DEC,NEG,CMP |
|
乘/除法 |
MUL,IMUL,DIV,IDIV |
|
逻辑 |
AND,OR,NOT,XOR,TEST |
|
移位 |
SHL/SHR/SAR,ROL/ROR,RCL/RCR |
|
串操作 |
MOVS,CMPS,SCAS,LODS,STOS |
|
控制转移 |
JMP,JXX,LOOP,CALL/RET,INT/IRET |
立即数(常数)只能用作源操作数
寄存器操作数:放在8个通用寄存器或4个段寄存器中的操作数
存储单元的物理地址 = 段基地址 + 偏移地址
8086的寻址方式:
寻址方式——寻找操作数的方法(如何取得操作数)
寻找操作数的地址(一般指源操作数)寻找要执行的下一条指令的地址
在8086指令系统中,说明操作数所在地址的寻址方式可分为8种:
①立即寻址 ⑤ 寄存器相对寻址
②直接寻址 ⑥基址-变址寻址
③寄存器寻址 ⑦相对的基址-变址寻址(基址-变址相对寻址)
④寄存器间接寻址 ⑧隐含寻址(略)
立即寻址:例:
MOV AX, 1C8FH
MOV BYTEPTR[2A00H], 8FH
MOV 2A00H, AX ;错误直接寻址:默认的段寄存器为DS,但也可以显式地指定其他段寄存器——称为段超越前缀
偏移地址也可用符号地址来表示,如ADDR、VAR
例:MOV AX , [2A00H]
MOV DX , ES: [2A00H]
MOV SI , TABLE_PTR
指令操作例:MOV AX,[3102H]
AL (3102H) , AH (3103H)
寄存器寻址
操作数放在某个寄存器中,源操作数与目的操作数字长要相同,寄存器寻址与段地址无关
例: MOV AX, BX
MOV [3F00H], AX
错误例:
× MOV AX, BL ; 字长不同
× MOV ES: AX, DX ; 寄存器与段无关
指令操作例:MOV SI,AX ; SI (AX)
寄存器间接、寄存器相对、基址变址、相对基址变址四种寻址方式的比较:
寻址方式 指令操作数形式
n 寄存器间接 只有一个寄存器(BX/BP/SI/DI之一)
n 寄存器相对 一个寄存器加上位移量
n 基址—变址 两个不同类别的寄存器
n 相对基址-变址 两个不同类别的寄存器加上位移量
寄存器间接寻址
l 操作数的偏移地址(有效地址EA)放在寄存器中
l 只有SI、DI、BX和BP可作间址寄存器
l 例:MOV AX, [BX]
MOV CL,CS:[DI]
l 错误例 :
• × MOV AX, [DX]
l 指令操作例:MOV AX,[SI]
若 (DS)=6000H, (SI)=1200H, (61200H)=44H, (61201H)=33H 则指令执行后,(AX)=3344H。
寄存器相对寻址
l EA=间址寄存器的内容加上一个8/16位的位移量
寄存器相对寻址常用于存取表格或一维数组中的元素——把表格的起始地址作为位移量,元素的下标值放在间址寄存器中(或反之)
l 例: MOV AX, [BX+8]
• MOV CX, TABLE[SI]
• MOV AX, [BP+1000H] ; 默认段寄存器为SS
l 指令操作例:MOV AX,DATA[BX]
• 若(DS)=6000H,(BX)=1000H, DATA=2A00H, (63A00H)=66H, (63A01H)=55H
• 指令执行后:(AX)=5566H
基址-变址寻址
l 若操作数的偏移地址:
由基址寄存器(BX或BP)给出 —— 基址寻址方式
由变址寄存器(SI或DI)给出 —— 变址寻址方式
l 由一个基址寄存器的内容和一个变址寄存器的内容相加而形成操作数的偏移地址,称为基址-变址寻址。
同一组内的寄存器不能同时出现
例: MOV AX, [BX] [SI]
MOV AX, [BX+SI]
MOV AX, DS: [BP] [DI]
错误例:
× MOV AX, [BX] [BP]
×MOV AX, [DI] [SI]
指令操作例:MOV AX,[BX][SI]
假定:(DS)=8000H, (BX)=2000H, SI=1000H
指令执行后: (AL)=[83000H] (AH)=[83001H] 在数据段中
相对的基址-变址寻址
l 在基址-变址寻址的基础上再加上一个相对位移量
l 注意事项同基址-变址寻址
MOV AX,BASE [SI] [BX]
MOV AX,[BX+BASE] [SI]
MOV AX,[BX+SI+BASE]
MOV AX,[BX] BASE [SI]
MOV AX,[BX+SI] BASE
指令操作例:MOV AX,DATA[DI][BX]
若(DS)=8000H,(BX)=2000H, (DI)=1000H, DATA=200H 指令执行后(AH)=[83201H], (AL)=[83200H]
使用相对的基址-变址寻址方式可以很方便地访问二维数组。
隐含寻址
l 指令操作数是隐含的,在指令中未显式地指明。
l 例:MUL BL
指令隐含了被乘数AL及乘积AX
l 类似的指令还有:DIV、CBW、MOVS等