汇编指令

 AX 累加器,算术,逻辑运算,外设传输
AH
AL
EAX

BX 基址寄存器,存放存储器地址
BH
BL
EBX 指向DS段中数据的指针

CX 循环计数器,串操作中隐含计算器
CH
CL
ECX 串和循环操作的计算器

DX 数据寄存器,存放双字节高16位,端口地址
DH
DL
EDX I/O端口指针

SI 源地址寄存器,自增减,寻址DS
ESI 串操作的原操作数指针DS段
DI 目的地址寄存器,自增减,寻址ES
EDI 串操作的原操作数指针ES段
BP 基址指针
EBP 定位堆栈位置,指向堆栈中数据的指针SS段
SP 堆栈指针
ESP 堆栈顶指针SS段

CS 代码段寄存器
SS 堆栈段寄存器
DS 数据段寄存器
ES 附加段寄存器
FS
GS

IP 指令指针

FLAGS 标志寄存器
状态标志
CF 进位标志,最高有效位,有进位或借位,进位CF=1,否则CF=0
ZF 零标志,运算结果为0,ZF=1,否则ZF=0
SF 符号标志,运算结果最高位为1,SF=1,否则SF=0
PF 奇偶标志,运算结果最低8位字节中1的个数为零或偶数,PF=1,否则PF=0
OF 溢出标志,算术运算结果有溢出,OF=1,否则OF=0
AF 辅助进位标志,运算时低半字节有进位或借位,AF=1,否则AF=0
控制标志
DF 方向标志,DF=0串操作后存储器地址自增,DF=1自减
IF 中断允许标志,IF=1允许中断,否则IF=0
TF 陷阱标志,TF=1处理器单步执行指令,TF=0正常执行
32位标志
NT NT=1表示当前任务嵌套于另一任务,执行完返回原来任务
IOPL 表示程序所处的特权级
VM 虚拟8086方式,VM=1
RF 回复标志与调试寄存器一起使用
AC 对齐检测标志,设置是否在存储器位访问时进行数据对齐检测
VIF 虚拟中断标志,IF的影像与VIP联用
VIP 虚拟中断挂起标志,标志一个中断被挂起
ID CPU识别标志,如果能置位或复位这个标志,表示改处理器支持识别指令CPUID

 



--  8088汇编指令表
一、数据传输指令
───────────────────────────────────────
    它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据.
    1. 通用数据传送指令.
        MOV    传送字或字节.
        MOVSX  先符号扩展,再传送.
        MOVZX  先零扩展,再传送.
        PUSH    把字压入堆栈SS,SP指向堆栈顶,SP-2
        POP    把字弹出堆栈,后进先出. SP+2
        PUSHA  把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈. (32位)
        POPA    把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈.(32位)
        PUSHAD  把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈. (32位)
        POPAD  把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈. (32位)
        BSWAP  交换32位寄存器里字节的顺序

        XCHG    交换字或字节.( 至少有一个操作数为寄存器,段寄存器不可作为操作数)
 例: mov ax,1234h
     xchg ah,al ;ax=3412h
        CMPXCHG 比较并交换操作数.( 第二个操作数必须为累加器AL/AX/EAX )
        XADD    先交换再累加.( 结果在第一个操作数里 )
        XLAT    从BX寄存器,取出AL位移处数据赋给AL( [BX+AL]->AL )

    2. 输入输出端口传送指令.
        IN      I/O端口输入. ( 语法: IN 累加器, {端口号│DX} )
        OUT    I/O端口输出. ( 语法: OUT {端口号│DX},累加器 )
          输入输出端口由立即方式指定时, 其范围是 0-255; 由寄存器 DX 指定时,
          其范围是 0-65535.
    3. 目的地址传送指令.
        LEA    装入有效地址.
          例: LEA DX,string  ;把偏移地址存到DX.
        LDS    传送目标指针,把指针下一字内容装入DS.
          例: LDS SI,string  ;把段地址:偏移地址存到SI<-[string],DS,<-[string]+4.
        LES    传送目标指针,把指针下一字内容装入ES.
          例: LES DI,string  ;把段地址:偏移地址存到DI<-[string],ES,<-[string]+4.
        LFS    传送目标指针,把指针内容装入FS.
          例: LFS DI,string  ;把段地址:偏移地址存到FS:DI.
        LGS    传送目标指针,把指针内容装入GS.
          例: LGS DI,string  ;把段地址:偏移地址存到GS:DI.
        LSS    传送目标指针,把指针内容装入SS.
          例: LSS DI,string  ;把段地址:偏移地址存到SS:DI.
    4. 标志传送指令.
        LAHF    把标志寄存器FLAGS低字节装入AH.(SF/ZF/AF/PF/CF送入7/6/4/2/0,5/3/1位任意)
        SAHF    把AH内容装入标志寄存器FLAGS低字节,逆向LAHF.
        PUSHF  标志入栈,栈顶指针SP-2. (sp<-sp-2, SS:[SP]<-FLAGS)
        POPF    标志出栈,栈顶指针SP+2. (FLAGS<-SS:[SP], SP<-SP+2)
        PUSHD  32位标志入栈.
        POPD    32位标志出栈.
 PUSHFD 压入EFLAGS
 POPFD 弹出EFLAGS

二、算术运算指令
───────────────────────────────────────
        ADD    加法. (影响全部标志位)
        ADC    带进位加法. 多精度数相加
        INC    加 1. 不影响CF标志
        AAA    加法的ASCII码调整. 转成ASCII码相加,以16进制数返回,有进位AH+1,CF=AF=1否则为0,AL高4位清0
        DAA    加法的十进制调整. 跟在ADD/ADC之后,(其实就是将16进制数当10进制计算相加)
        SUB    减法. (影响全部标志位)
        SBB    带借位减法. 多精度数相减
        DEC    减 1. 不影响CF标志
        NEG    求反(以 0 减之).
        CMP    比较.(两操作数作减法,仅修改标志位,不回送结果).
        AAS    减法的ASCII码调整. 有借位AH-1,CF=AF=1否则为0,AL高4位清0
        DAS    减法的十进制调整.
        MUL    无符号乘法. 字节相乘存入AX,16位数相乘得出32位值,高字存入DX,低字存入AX
        if (AH/DX == 0) -> 标志位OF=CF=0,否则为1. 由此判断高半位是否有效数字
        IMUL    整数乘法. 如果乘积高一半是低一半的符号扩展,OF=CF=0,否则为1
          以上两条,结果回送AH和AL(字节运算),或DX和AX(字运算),
        AAM    乘法的ASCII码调整. 设置标志位SF/ZF/PF,高4位清0,AX目的操作数返回值
        DIV    无符号除法. 字节除法,商存入AL,余数存入AH。字除法,商存入AX,余数存入DX。余数无符号
        IDIV   有符号整数除法.
          以上两条,结果回送:
              商回送AL,余数回送AH, (字节运算);
          或  商回送AX,余数回送DX, (字运算).
        AAD    除法的ASCII码调整. (难理解)
        CBW    字节转换为字. (把AL中字节的符号扩展到AH中去)
        CWD    字转换为双字. (把AX中的字的符号扩展到DX中去)
        CWDE    字转换为双字. (把AX中的字符号扩展到EAX中去)
        CDQ    双字扩展.    (把EAX中的字的符号扩展到EDX中去)

三、逻辑运算指令
───────────────────────────────────────
        AND    与运算. 两位都是1,结果为1,否则为0,结果存入目的操作数(后),复位0:要置0的位和0相与,否则用1相与
        OR      或运算. 其中一位为1,结果为1,否则为0
        XOR    异或运算. 两位结果不相同,结果为1,否则为0,求反:和1异或,不变位和0
        NOT    取反.
        TEST    测试.(两操作数作与运算,仅修改标志位,不回送结果).
 以上指令,NOT除外(CF/OF=0,AF未定义,按需设置SF/ZF/PF)

        SHL    逻辑左移.
        SAL    算术左移.(=SHL)
        SHR    逻辑右移.
        SAR    算术右移.(=SHR)
        ROL    循环左移.
        ROR    循环右移.
        RCL    通过进位的循环左移.
        RCR    通过进位的循环右移.
          以上八种移位指令,其移位次数可达255次.
              移位一次时, 可直接用操作码.  如 SHL AX,1.
              移位>1次时, 则由寄存器CL给出移位次数.
                如  MOV CL,04
                    SHL AX,CL

四、串指令
───────────────────────────────────────
 DS:SI  源串段寄存器  :源串变址.
 ES:DI  目标串段寄存器:目标串变址.
  DI,SI指针自动增减(土1字节,土2字)取决于方向标志DF
  系统初始化执行CLD指令后DF=0,+1/2,STD指令后DF=1,-1/2
 CX      重复次数计数器.
 AL/AX  扫描值.
 DF标志  0表示重复操作中SI和DI应自动增量; 1表示应自动减量.
 ZF标志  用来控制扫描或比较操作的结束.
        MOVS    串传送.
            ( MOVSB  传送字节.    MOVSW  传送字.    MOVSD  传送双字. )
     ( 另一种写法:MOVS byte ptr 传送字节.    MOVS word ptr  传送字. )  
        CMPS    串比较. 根据减法结果设置标志位
            ( CMPSB  比较字符.    CMPSW  比较字. )
        SCAS    串扫描. 比较ES和AX/AL的值,操作DI指针指向ES
            把AL或AX的内容与目标串作比较,比较结果反映在标志位.
        LODS    装入串. SI存入AL/AX
            把源串中的元素(字或字节)逐一装入AL或AX中.
     STOSB ;AL<-DS:[SI],SI<-SI土1
     STOSW ;AX<-DS:[SI],SI<-SI土2
            ( LODSB  传送字符.    LODSW  传送字.    LODSD  传送双字. )
        STOS    保存串. AL/AX存入DI
            是LODS的逆过程.
     STOSB ;ES:[DI]<-AL,DI<-DI土1
     STOSW ;ES:[DI]<-AX,DI<-DI土2
        REP            当CX/ECX!=0时重复. 用在MOVS,STOS,LODS前
        REPE/REPZ      当ZF=1或比较结果相等,且CX/ECX!=0时重复. 用在CMPS,SCAS前
        REPNE/REPNZ    当ZF=0或比较结果不相等,且CX/ECX!=0时重复. 用在CMPS,SCAS前
        REPC          当CF=1且CX/ECX!=0时重复.
        REPNC          当CF=0且CX/ECX!=0时重复.

 输入输出端口传送指令.
 INS 由DX指定地址I/O输入,传输到ES,DI指定的存储单元,DI土1
 OUTS 由DS:SI指针输出到DX指定I/O,SI土1

五、程序转移指令
───────────────────────────────────────
    1>无条件转移指令 (长转移)
        JMP    无条件转移指令
        CALL    过程调用
        RET/RETF/RETN  /段内/段间,过程返回.
    2>条件转移指令 (短转移,-128到+127的距离内)
        ( 当且仅当(SF XOR OF)=1时,OP1<OP2 )
        JA/JNBE 不小于或不等于时转移.
        JAE/JNB 大于或等于转移.
        JB/JNAE 小于转移.
        JBE/JNA 小于或等于转移.
          以上四条,测试无符号整数运算的结果(标志C和Z).
        JG/JNLE 大于转移.
        JGE/JNL 大于或等于转移.
        JL/JNGE 小于转移.
        JLE/JNG 小于或等于转移.
          以上四条,测试带符号整数运算的结果(标志S,O和Z).
        JE/JZ  等于转移.
        JNE/JNZ 不等于时转移.
        JC      有进位时转移.
        JNC    无进位时转移.
        JNO    不溢出时转移.
        JNP/JPO 奇偶性为奇数时转移.
        JNS    符号位为 "0" 时转移.
        JO      溢出转移.
        JP/JPE  奇偶性为偶数时转移.
        JS      符号位为 "1" 时转移.
    3>循环控制指令(短转移)
        LOOP            CX不为零时循环. CX--
        LOOPE/LOOPZ    CX不为零且标志Z=1时循环.
        LOOPNE/LOOPNZ  CX不为零且标志Z=0时循环.
        JCXZ            CX为零时转移.
        JECXZ          ECX为零时转移.
    4>中断指令
        INT     int21h中断指令
  AH=02H 输出字符,DL存放输出字符(ASCII)
  AH=09H 输出字符串,DS:DX offset string存放字符串
  AH=01H 输入字符,AL存放输入的字符
  AH=0AH 输入字符串,DS:DX offset string存放字符串
  AH=0BH 判断是否按键,AL=0无按键,AL=FFH已经按键
  ROM-BIOS键盘功能调用int16h中断指令
  AH=1 判断是否按键,ZF=1无按键,ZF=0有按键,AX=键值代码

        INTO    溢出中断
        IRET    中断返回
    5>处理器控制指令
        HLT    处理器暂停, 直到出现中断或复位信号才继续.
        WAIT    当芯片引线TEST为高电平时使CPU进入等待状态,低电平才返回.
        ESC    转换到浮点处理器执行.
        LOCK    封锁总线. 直到命令完成后解锁
        NOP    空操作. 填充代码空间
 SEG 段超越前缀指令,用指定段寄存器寻址操作数(CS/SS/DS/ES)

        STC    置进位标志位. CF=1
        CLC    清进位标志位. CF=0
        CMC    进位标志取反. CF=~CF
        STD    置方向标志位. DF=1
        CLD    清方向标志位. DF=0
        STI    置中断允许位. IF=1
        CLI    清中断允许位. IF=0

六、伪指令
───────────────────────────────────────
        DB/DW/DD/DF/DQ/DT      字节/字/双字/三字/四字/十字
 DUP: 复制操作符。DUP 前面的常量或表达式的值(正整数)指明DUP 后面的括号中的操作数之重复次数
        PROC/ENDP    函数定义. 

 PROTO 声明函数
 LOCAL 定义局部变量,可以用在宏定义第一行
 INVOKE 调用函数

 宏
 MACRO/ENDM/EXITM 宏定义
 PURGE 删除宏定义
 REPEAT 重复指定次数
 FOR 重复参数个数
 FORC 按参数字符个数重复
 IF/ELSE/ENDIF/... 条件宏

 STRUCT 结构
 RECORD 记录
 UNION 联合
 TYPEDEF 类型定义

 简化代码定义
 .STARTUP 程序开始
 .EXIT 0  程序结束,返回DOS
 .DATA/.DATA?/.CONST/.CODE/.MODEL/.STACK/

 完整代码定义
        SEGMENT 完整定义段. 定义堆栈段/代码段/数据段
        ENDS    段结束.
        ASSUME  建立段寄存器寻址.
 GROUP 段组指令,将多个同类型段合并为一个物理段
 .SEG 按源程序顺序
 .DOSSEG 按DOS顺序
 .ALPHA 按段名字母顺序

        END     汇编结束.
 (START:  
 END START  由END指定开始的段地址)

 .IF/.ELSEIF/.ELSE/.ENDIF 
 == != > && || ! >= <= < & ()
 CARRRY?(CF=1?) OVERFLOW?(OF=1?) PARITY?(PF=1?) SIGN?(SF=1?) ZERO?(ZF=1?)
 .WHILE/.ENDW
 .REPEAT/.UNTIL  先循环后判断
 .UNTILCXZ[表达式] CX=0或条件为真
 .BREAK/.CONTINUE

 OFFSET  偏移地址
 SEG 返回名字或标号的段地址
 PTR 指定字节/字等类型
 THIS 指定当前逻辑地址

 ORG 将偏移地址指针指向表达式的偏移地址
 EVEN 指向偶数地址
 ALIGN 指向n(2的乘方)的整数倍地址

 [] 将表达式作为存储器地址指针
 $ 当前偏移地址
 SIZEOF 变量占用字节数
 LENGTHOF 变量数据项个数
 TYPE 返回类型,即所占的字节数
 SIZEOF = LENGTHOF * TYPE
 EQU 比较字符或数值
 = 比较数值

 


运算符 + - * / MOD AND OR XOR NOT SHL(逻辑左移) SHR(逻辑右移)
 EQ(等于) NE(不等) GT(大于) LT(小于) GE(大于等于) LE(小于等于)
 HIGH高字节 LOW低字节 HIGHWORD高字 LOWWORD低字 mov ah,HIGH 8765h; ==mov ah,87h

 

 


PE文件结构

.text 代码段,包含IAT

.bss 未初始化数据

.rdata 常量

.data 变量

.rsrc 模块的资源信息

.edata 导出数据段,包含了应用程序或DLL的导出数据

.idata 导入数据段,包括导入库和导入地址名称表

.debug 调试信息段

.reloc 不进行映射的段


 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值