逆向工程核心原理3:汇编指令


指令
示例
说明
PUSH
push 寄存器/内存单元
入栈
POP
pop 寄存器/内存单元
出栈
INC

+1
DEC

-1
CMP

比较两个操作数,操作数的值不会改变,若相等,则ZF置1
JE

条件跳转指令,若ZF为1,则跳转
MOV
mov ax,18
mov ah, 10
mov ax,bx
赋值
ADD
add ax, 10
add ax, bx
加法
SUB
sub ax, 10
sub ax, bx
减法
AND

&
OR

|
DIV
除数 :  8位或16位,存在内存单元中
被除数 : 默认放在AX和DX中
             如果为8位,放在AX中
             如果为16位,DX存高16位,AX存低16位
结果 :  如果为8位,AL为商, DL为余数
          如果为16位,AX位商, DX为余数

除法
MUL
如果为8位,一个默认在AL中,一个在8位reg或内存单元中, 结果默认存放在AX中
如果为16位,一个默认在ax中,一个在16位reg或内存单元中,高位放DX, 低位放AX
乘法
db/dw/dd
dd 1111 2222 3333
byte/world/double world
DUP
db 3 dump (1,2,3)
连续定义三个1,2,3
JMP
jmp short 标号
jmp far 标号
无条件跳转
JCX

条件跳转
LOOP
mov cx, 10
s:
  inc ax
  loop s
判断寄存器cx等于0
RET

用栈中的数据实现跳转,一般为函数执行完毕



CALL

调用指定位置的函数, 一般为函数调用
JE/JNE
JB/JNB
JA/JNA


JE : 等于则跳转, ZF = 1
JNE :不等于则跳转 ZF = 0
JB : 低于则跳转, cf = 1
JNB : 不低于则跳转, cf = 0
JA : 高于则跳转, cf = 0 and zf = 0
JNA : 不高于则跳转, cf = 1 or zf = 1
shl
mv al, 0100100b
shl  al, 1
执行后al = 1001000b
逻辑左移
shr
mv al, 0100100b
shr  al, 1
执行后al = 0010010b
逻辑右移









cpu组成 :
    运算器 :  信息处理
    控制器 : 控制各个器件进行工作
    寄存器 : 信息存储
    
寄存器 :
    通用寄存器 : (16位)
        AX : 分为 AH 和 AL
        BX : 分为 BH和 BL
        CX : 分为 CH和 CL
        DX : 分为 DH和 DL


段寄存器 : 
    CS : 代码段寄存器
    IP : 指令指针寄存器
    CS:IP 指向的内容为当前要执行的指令

其他寄存器 :
    DS : 数据地址寄存器 (存放需要访问的数据地址)
    示例 :
        mov ax , 1000H
        mov ds, ax
        mov bx, [0]            ;将内存地址1000H处的值拷贝给bx寄存器
        mov [10], cx           ;将cx寄存器的值拷贝给内存1010H内存处

堆栈寄存器 :
    SS : 段寄存器
    SP :
    SS:SP 指向栈顶

flag寄存器 :
    

    ZF : 零标志位,执行相关指令后,结果为0,则ZF=1, 不为0, 则ZF=1
    PF : 奇偶标志,执行相关命令后,结果中1的位数为偶数,则PF =1 , 否则 PF = 0
    SF  :  符号标志, 执行相关命令后,结果为负数, 则 是否SF=1, 否则SF=0
    CF  :  进位标志, 相加或相减, 向更高位借位或者进位的时候, CF = 1
    OF  : 溢出标志, 相加或相减,产生溢出, OF = 1
    DF :  方向标志, 如果DF = 0, 每次操作后, si di递增,  如果DF = 1, 每次操作后, si di递减

猜你喜欢

转载自blog.csdn.net/dengshengli123/article/details/80807507