首页
社区
课程
招聘
[原创]汇编基础学习笔记
2020-10-10 13:39 3727

[原创]汇编基础学习笔记

2020-10-10 13:39
3727
菜鸟最近才刚刚开始学习逆向,做了一些汇编的笔记,如下:

1 . 32位通用寄存器

  • 数据寄存器EAX, EBX, ECX, EDX.

    EAX:累加寄存器,是很多加法乘法指令的缺省寄存器
    EBX:基址寄存器,在内存寻址时存放基地址
    ECX:计数寄存器,是重复(REP)前缀指令和LOOP指令的内定计数器
    EDX:数据寄存器,总是被用来放整数除法产生的余数.

  • 段寄存器

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

  • 索引寄存器ESI, EDI

    ESI:源索引寄存器
    EDI:目的索引寄存器
    在很多字符串操作指令中,DS:ESI指向源串,而ES:EDI指向目标串

  • 指令指针寄存器

    EIP:指令指针寄存器,存储的是CPU下次要执行的指令的地址.

  • 指针寄存器

    EBP为基指针寄存器,用它可直接存取堆栈中的数据。
    ESP为堆栈指针寄存器,用它只可访问栈顶。

  • 标志寄存器

进位标志CF(Carry Flag):

进位标志CF主要用来反映运算是否产生进位或借位。如果运算结果的最高位产生了一个进位或借位,那么,其值为1,否则其值为0。

 

奇偶标志PF(Parity Flag):

奇偶标志PF用于反映运算结果中“1”的个数(二进制)的奇偶性。如果“1”的个数为偶数,则PF的值为1,否则其值为0。

 

辅助进位标志AF(Auxiliary Carry Flag)

在发生下列情况时,辅助进位标志AF的值被置为1,否则其值为0:
(1)、在字操作时,发生低字节向高字节进位或借位时;
(2)、在字节操作时,发生低4位向高4位进位或借位时。

 

零标志ZF(Zero Flag)

零标志ZF用来反映运算结果是否为0。如果运算结果为0,则其值为1,否则其值为0。在判断运算结果是否为0时,可使用此标志位。

 

符号标志SF(Sign Flag)

符号标志SF用来反映运算结果的符号位,它与运算结果的最高位相同。在微机系统中,有符号数采用补码表示法,所以,SF也就反映运算结果的正负号。运算结果为正数时,SF的值为0,否则其值为1。

 

溢出标志OF(Overflow Flag)

溢出标志OF用于反映有符号数加减运算所得结果是否溢出。如果运算结果超过当前运算位数所能表示的范围,则称为溢出,OF的值被置为1,否则,OF的值被清为0。

 

追踪标志TF(Trap Flag)

当追踪标志TF被置为1时,CPU进入单步执行方式,即每执行一条指令,产生一个单步中断请求。这种方式主要用于程序的调试。
指令系统中没有专门的指令来改变标志位TF的值,但程序员可用其它办法来改变其值。

 

中断允许标志IF(Interrupt-enable Flag)

中断允许标志IF是用来决定CPU是否响应CPU外部的可屏蔽中断发出的中断请求。但不管该标志为何值,CPU都必须响应CPU外部的不可屏蔽中断所发出的中断请求,以及CPU内部产生的中断请求。具体规定如下:
(1)、当IF=1时,CPU可以响应CPU外部的可屏蔽中断发出的中断请求;
(2)、当IF=0时,CPU不响应CPU外部的可屏蔽中断发出的中断请求。

 

方向标志DF(Direction Flag)

方向标志DF用来决定在串操作指令执行时有关指针寄存器发生调整的方向。具体规定在第5.2.11节——字符串操作指令——中给出。在微机的指令系统中,还提供了专门的指令来改变标志位DF的值。


2. 常用的32汇编指令

  • ADD :加法
  • ADC :带位加法
  • SBB :带位减法
  • SUB:减法.
  • INC :加法.
  • CMP :比较.(两操作数作减法,仅修改标志位,不回送结果).
  • AND :与运算.
  • OR :或运算.
  • XOR :异或运算.
  • NOT :取反.

  • MOV:传送字或字节.

  • MOVSX:先符号扩展,再传送.
  • PUSH:把字压入堆栈.
  • POP:把字弹出堆栈.
  • PUSHA:把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈.
  • POPA : 把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈.
  • PUSHAD : 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈.
  • POPAD : 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈.
  • LEA : 装入有效地址. 例: LEA DX,0xAA //把0xAA地址存到DX.

  • JMP :无条件转移指令

  • CALL:过程调用 .
  • RET/RETF : 过程返回.
  • JCC指令:
JCC指令 含义 英文 检查符号位 C语句
JZ/JE 若为0则跳转;若相等则跳转 jump if zero;jump if equal ZF=1 if (i == j);if (i == 0);
JNZ/JNE 若不为0则跳转;若不相等则跳转 jump if not zero;jump if not equal ZF=0 if (i != j);if (i != 0);
JS 若为负则跳转 jump if sign SF=1 if (i < 0);
JNS 若为正则跳转 jump if not sign SF=0 if (i > 0);
JP/JPE 若1出现次数为偶数则跳转 jump if Parity (Even) PF=1 /
JNP/JPO 若1出现次数为奇数则跳转 jump if not parity (odd) PF=0 /
JO 若溢出则跳转 jump if overflow OF=1 /
JNO 若无溢出则跳转 jump if not overflow OF=0 /
JC/JB/JNAE 若进位则跳转;若低于则跳转;若不高于等于则跳转 jump if carry;jump if below;jump if not above equal CF=1 if (i < j);
JNC/JNB/JAE 若无进位则跳转;若不低于则跳转;若高于等于则跳转; jump if not carry;jump if not below;jump if above equal CF=0 if (i >= j);
JBE/JNA 若低于等于则跳转;若不高于则跳转 jump if below equal;jump if not above ZF=1或CF=1 if (i <= j);
JNBE/JA 若不低于等于则跳转;若高于则跳转 jump if not below equal;jump if above ZF=0或CF=0 if (i > j);
JL/JNGE 若小于则跳转;若不大于等于则跳转 jump if less;jump if not greater equal jump SF != OF if (si < sj);
JNL/JGE 若不小于则跳转;若大于等于则跳转; jump if not less;jump if greater equal SF = OF if (si >= sj);
JLE/JNG 若小于等于则跳转;若不大于则跳转 jump if less equal;jump if not greater ZF != OF 或 ZF=1 if (si <= sj);
JNLE/JG 若不小于等于则跳转;若大于则跳转 jump if not less equal;jump if greater SF=0F 且 ZF=0 if(si>sj)
 

目前就学了这么多
(○` 3′○)


[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。

最后于 2020-10-10 14:05 被郁涛丶编辑 ,原因:
收藏
点赞5
打赏
分享
最新回复 (2)
雪    币: 51
活跃值: (209)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
真实的我 2020-10-10 15:46
2
0
总结得很好。
雪    币: 246
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
郁涛丶 2020-10-10 18:01
3
0
真实的我 总结得很好。
刚开始学习逆向,还有很多要学习的东西
游客
登录 | 注册 方可回帖
返回