8086/8088汇编语言基础(一)

时间:2021-10-31 11:45:25

关于汇编语言  百度百科-汇编语言


汇编语言作为最接近底层的,人类能够读懂的语言,在计算机快速发展的时代里,同样能够发挥许多作用。相比高级语言,拥有着更高的效率,在逆向方面,软件安全防护方面,发挥着重要的作用。


汇编基础知识(概念):

指令——控制计算机完成指定操作的命令

机器指令——指令的二进制代码形式。例如: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) 

 

寄存器间接、寄存器相对、基址变址、相对基址变址四种寻址方式的比较:

  寻址方式            指令操作数形式

 寄存器间接          只有一个寄存器(BX/BP/SI/DI之一)

 寄存器相对          一个寄存器加上位移量

 基址—变址          两个不同类别的寄存器

 相对基址-变址     两个不同类别的寄存器加上位移量

 

寄存器间接寻址

操作数的偏移地址(有效地址EA)放在寄存器中

 只有SI、DI、BXBP可作间址寄存器

   例:MOV   AX, [BX]

               MOV   CL,CS:[DI]

    错误例 :

•               ×  MOV    AX, [DX]

指令操作例:MOV  AX,[SI]

若 (DS)=6000H,  (SI)=1200H, (61200H)=44H,  (61201H)=33H 则指令执行后,(AX)=3344H。

 

寄存器相对寻址

EA=间址寄存器的内容加上一个8/16位的位移量

寄存器相对寻常用于存取表格或一维数组中的元素——把表格的起始地址作为位移量,元素的下标值放在间址寄存器中(或反之)

例:                MOV   AX, [BX+8]

•                     MOV   CX, TABLE[SI]

•                     MOV   AX, [BP+1000H] ; 默认段寄存器为SS

 指令操作例:MOV  AX,DATA[BX]

•           若(DS)=6000H,(BX)=1000H, DATA=2A00H, (63A00H)=66H, (63A01H)=55H

•           指令执行后:(AX)=5566H

 

基址-变址寻址

若操作数的偏移地址:

   由基址寄存器(BX或BP)给出 —— 基址寻址方式

   由变址寄存器(SI或DI)给出 —— 变址寻址方式

由一个基址寄存器的内容和一个变址寄存器的内容相加而形成操作数的偏移地址,称为基址-变址寻址。

同一组内的寄存器不能同时出现

例:   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] 在数据段中

 

相对的基址-变址寻址

在基址-变址寻址的基础上再加上一个相对位移量

 注意事项同基址-变址寻址

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]

 

使用相对的基址-变址寻址方式可以很方便地访问二维数组。

 

隐含寻址

  指令操作数是隐含的,在指令中未显式地指明。

  例:MUL  BL

     指令隐含了被乘数AL及乘积AX

  类似的指令还有:DIV、CBW、MOVS等