[关闭]
@shaobaobaoer 2019-06-09T05:45:41.000000Z 字数 4603 阅读 1153

RE 0 : 汇编语言程序设计

汇编


汇编学的实在是太菜了。趁着这个国庆好好看下

一. 基本概念

字,字节

可见寄存器组

图片1.png-50.6kB

位、字节和字

位:计算机存储信息的基本单位,存储二进制数0或1。
字节:每8位组成一个字节,在存储器里以字节单位存储。
字长:8086/8088、80286字长为16位,由2个字节组成;80386字长为32位,由4个字节组成,双字。

段寄存器和数据寄存器的关系

偏 移
CS
DS
ES
SS
IP
BX、DI、SI或16位数
DI
SP或BP

标志位

二 . 寻址方法

直接寻址

TIM截图20180909160905.png-49.6kB

MOV AX , [2000H];【位移量】

AX = (DS) * 16 D + [BIAS]

段跨越前缀

MOV AX,ES:[VALUE]

当指定段的时候就要用(ES) * 16 d 了不指定的话就默认是 (DS)

寄存器间接寻址

TIM截图20180909161131.png-43.5kB

MOV AX,[BX]

AX = (DS) * 16 d + (BX)

寄存器相对寻址

TIM截图20180909161540.png-47.4kB

MOV AX,COUNT[SI]
MOV AX,[COUNT + SI]

AX = (DS) * 16 d + (COUNT + (SI))

扩展部分

MOV EAX, TABLE[ESI]
MOV DL, STRING[SI]

基址变址寻址

TIM截图20180909162225.png-25.6kB

MOV AX, [BX][DI]

AX = (DS) * 16 d + (BX) + (DI)

相对基址变址寻址

TIM截图20180909163523.png-48.1kB

MOV AX,MASK[BX][SI]

AX = (DS) * 16 d + (BX) + (SI) +MASK

短跳转、近跳转

段内直接短转移(短跳转):位移量8位

-128 ~ +127
80386以后机型也可为8位和32位
加操作符SHORT
只能用作段内直接寻址的条件转移指令

段内直接近转移(近跳转):位移量16位

-32768 ~ +32767 
80386以后机型也可为8位和32位
加操作符 NEAR  PTR
其中,NEAR PTR可缺省。
通常,默认的东西使用比较广泛。

段内直接寻址

TIM截图20180909164121.png-66.3kB

EB 04 JMP SHORT NEXT

段内间接寻址

JMP BX
JMP WORD PTR [BP + TABLE]

段内转移(直接或间接),程序仍在同一段内跳转:

            CS不变,IP修改。

跳转总结

TIM截图20180909164507.png-50.4kB
TIM截图20180909164514.png-30.7kB

三. 汇编指令 传送指令

数据传送指令

一般形式:
MOV dst, src ; (dst) ← (src),
将源操作数src复制到目的操作数dst,src不变。

扩展形式:

MOVSX (Move with Sign-extend)
一般形式:
MOVSX dst, src ; src符号扩展为dst;386新增

MOVZX (Move with Zero-extend)
一般形式:
MOVZX dst, src ; src零扩展为dst;386新增

栈操作指令

进栈指令(入栈)
PUSH (Push onto the stack)
一般形式:
PUSH reg/mem/seg/imm
操作数可以是:寄存器、存储器、段寄存器以及立即数

PUSHA (Push All General Registers)
指令格式:PUSHA       ;80286+
其功能是依次把寄存器AX、CX、DX、BX、SP、BP、SI和DI等压栈。

PUSHAD (Push All 32-bit General Registers)
指令格式:PUSHAD      ;80386+
其功能是把寄存器EAX、ECX、EDX、EBX、ESP、EBP、ESI和EDI等压栈。

出栈指令
POP (Pop from the stack)
一般形式:
POP reg/mem/seg

POPA (Pop All General Registers)
指令格式:POPA       ;80286+
其功能是依次把寄存器DI、SI、BP、SP、BX、DX、CX和AX等弹出栈。
不用记住具体顺序,只要与指令PUSHA对称使用即可。
POPAD (Pop All 32-bit General Registers)
指令格式:POPAD      ;80386+
其功能是依次把寄存器EDI、ESI、EBP、ESP、EBX、EDX、ECX和EAX等弹出栈,它应该与PUSHAD对称使用。

交换指令

地址传送指令

以下指令结果相同

  1. LEA AXARR
  2. MOV AXOFFSET ARR
  3. 注:OFFSET ARR求出ARR的偏移地址

四. 汇编指令 算数指令

加法指令

inc 不影响标志

减法指令

dec 不影响标志

注意减法设置CF的规则:

乘法指令

MUL (Unsigned Multiply) 无符号数乘法指令
格式:MUL SRC
执行的操作:

IMUL(Signed Integer Multiply) 有符号数乘法指令
格式: IMUL SRC
注意:

除法指令

DIV(Unsigned Divide) 无符号除法指令
格式 DIV SRC
IDIV(Signed Integer Divide) 带符号除法指令
格式 IDIV SRC
操作时需要符号扩展指令

格式 DIV SRC,执行的操作:

位移指令

SHL、SHR、SAL、SAR: 移位指令

ROL、ROR、RCL、RCR: 循环移位指令

五. 汇编指令 跳转指令

实际上这里就是背单词

基于单个标志位的条件转移指令(Jumps Based on Special Arithmetic)

指令格式 检测的转移条件 功能描述
JE/JZ opr ZF=1 Jump Equal or Jump Zero
JNE/JNZ opr ZF=0 Jump Not Equal or Jump Not Zero
JC opr CF=1 Jump Carry
JNC opr CF=0 Jump Not Carry
JO opr OF=1 Jump Overflow
JNO opr OF=0 Jump Not Overflow
JP/JPE opr PF=1 Jump Parity or Jump Parity Even
JNP/JPO opr PF=0 Jump Not Parity or Jump Parity Odd
JS opr SF=1 Jump Sign (negative)
JNS opr SF=0 Jump Not Sign (positive)

无符号数和有符号数字的跳转指令

指令格式 检测的转移条件 功能描述
JA/JNBE opr CF=0 and ZF=0 Jump Above or Jump Not Below or Equal
JAE/JNB opr CF=0 Jump Above or Equal or Jump Not Below
JB/JNAE opr CF=1 Jump Below or Jump Not Above or Equal
JBE/JNA opr CF=1 or ZF=1 Jump Below or Equal or Jump Not Above
指令格式 检测的转移条件 功能描述
JG/JNLE opr ZF=0 and SF=OF Jump Greater or Jump Not Less or Equal
JGE/JNL opr SF=OF Jump Greater or Equal or Jump Not Less
JL/JNGE opr SF≠OF Jump Less or Jump Not Greater or Equal
JLE/JNG opr ZF=1 or SF≠OF Jump Less or Equal or Jump Not Greater

六. 串处理指令

方向标志 DF

MOVS

CMPS

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注