x86汇编总结

  • 寄存器
  • 指令
    • 数据传输指令
    • 算术运算
    • 位运算
    • 逻辑运算
    • 串操作
    • JCC
  • 寻址方式
  • 调用约定
    • 汇编是逆向的基础,太重要了;把笔记上的又总结了一遍,如有错误,欢迎指正~~互相进步,逆向路漫漫
  • 推荐零基础先看这个入门:http://www.ruanyifeng.com/blog/2018/01/assembly-language-primer.html

寄存器

  • 这里以x86汇编举例,参考了我室友的博客(推荐):http://www.irohane.top/index.php/archives/959/
// 顺序是OD中的寄存器顺序,记性不好,借助英文记忆,hhh
EAX(Accumulator):**累加寄存器**,也用作ret后的返回值
ECX(Count):**计数寄存器**,循环loop,串操作rep等会用到
EDX(Data):**数据寄存器**,可作为高位参与乘除运算,也保存除法产生的余数
EBX(Base):**基址寄存器**,主要用于寻址时存放基址
ESP(Stack Pointer):**堆栈指针寄存器**,永远指向系统栈最上面一个栈帧的栈顶部
EBP(Base Pointer):**基址指针寄存器**,永远指向系统栈最上面一个栈帧的栈底部,通常用它来索引参数和局部变量
ESI(Source)\EDI(Destination):**源\目标 索引寄存器**,
主要用于存放存储单元在段内的偏移量,寻址可能会用到;串操作指令中, DS:ESI指向源串,而ES:EDI指向目标串
EIP:指令指针寄存器,存储CPU要读取指令的地址;指向当前要执行的汇编代码
// EFLAGS 标志寄存器,参考自:https://blog.csdn.net/weixin_41890599/article/details/99866410
CF:进位标志位,**无符号数**运算,最高有效位向**更高位**的进位值或从更高位借位,产生进位或借位时CF=1,否则CF=0
PF:奇偶标志位,结果为偶数PF=1;结果为奇数PF=0
AF:辅助进位标志位,最后四位向前有进位或者借位,AF=1,否则AF=0
ZF:零标志位,指令执行后结果为0那么ZF=1,结果不为0则ZF=0
SF:符号标志位,指令执行后结果为负那么SF=1,结果非负数则SF=0
TF:调试标志位,当TF=1时,处理器每次只执行一条指令,即单步执行
DF:方向标志位,串处理指令中,每次操作后,如果DF=0,si、di递增,如果DF=1,si、di递减;cld命令是将DF设置为0,std命令是将DF设置为1
OF:溢出标志位,**有符号数**运算,发生溢出OF=1,如果没有OF=0
// 段寄存器,这个我用的不多;参考:https://www.cnblogs.com/FrankChen831X/p/10482718.html
CS代码段,包含代码段的段选择符,代码段保存正在执行的指令
DS数据段,
ES附加段,
FS标志段,
GS全局段,
SS堆栈段,包含栈段的段选择符,这里栈段用于存储程序/任务/当前正在执行的处理器程序的栈帧
// 控制寄存器
CR0:包含6个预定义标志,分为协处理器控制位和保护控制位两类;用法,通过修改CR0中的WP标志位去掉内存保护
CR1:保留
CR2:保存缺页异常时的线性地址
CR3:进程的页目录地址
CR4:PAE == 0 or 1,1 PAE分页 或 0 普通分页
// 调试寄存器 DRO ~ DR7
DRO ~ DR3 用于保存断点的线性地址.
DR7 - 分别保存4个断点的中断条件(包括读写还是执行RW0~ 3,长度LEN0~3等).
DR6 - 保存断点命中后的信息.
DR4, DR5 保留

指令

  • mov(助记符) ecx(目标操作数), 0x32(源操作数) <— 这是一条指令

    • 它的操作码是B9(mov ecx) 32 00 00 00(0x32) <— 即OPcode
  • IA-32指令集下载:链接:https://pan.baidu.com/s/1sdDx5DjICPLJoC_I403yAg提取码:78gl

数据传输指令

  • mov,将 数据 从一个位置移动到另一个位置
MOV EAX,EBX         // 将EBX中的内容复制到EAX寄存器中
MOV EAX,0x32        // 将立即数0x32复制到EAX寄存器中
MOV EAX,[0x4011D2]  // 将内存地址0x4011D2的4个字节复制到EAX寄存器中
MOV EAX,[EBX]       // 将EBX寄存器指向的内存地址复制到 EAX寄存器中
  • lea,将一个内存地址赋值给目标操作数
LEA EAX,[EBX+8]    // 将ebx+8的值赋值给eax,即eax = ebx+8
  • push:将操作数放到堆栈中,esp自减4

  • pop:将栈顶数据放到操作数中,esp自加4

  • call:相当于push(返回地址:即call下一行指令的地址) + jmp(跳转到call后接的地址)

  • ret:相当于pop eip,将call压入的返回地址,弹给 EIP

算术运算

  • add
ADD EAX,EBX    // 将ebx值加入eax,并将结果保存在eax中
  • sub
SUB EAX,0x10   // 将eax寄存器值减去0x10
  • inc
INC EDX        // edx值自增1
  • dec
DEC EDX        // edx值自减1
  • mul
MUL 0x50       // eax值乘以0x50,并将结果放入edx:eax中(edx表示高位,如果运算结果超出32位)
  • div
DIV 0x50       // 将 edx:eax 合起来的64位值,除以 value,商保存在 eax,余数保存在edx

位运算

  • and与
MOV AL,0110
AND AL,0011
// 执行后 al = 0010
  • or或
MOV AL,0110
AND AL,0011
// 执行后 al = 0111
  • xor异或
XOR EAX,EAX    // 将eax清零,相当于 mov eax, 0,但是xor占用字节更少
  • not取反:0变1,1变0

  • shl左移,将一个寄存器或内存单元中的数据向左移位,最后移出的一位写入CF中,最低位用0补充

// 参考:https://blog.csdn.net/judyge/article/details/52343582
mov al,01001000b
shl al,1 ;将al中数据左移一位
执行后(al)=10010000b,CF=0注意:如果移动位数大于1时,必须将移动位数放在**cl**中。
mov al,01010001b
mov cl,3
shl al,cl
执行后(al)=10001000b,因为最后移出的一位是0,所以CF=0
  • shr右移,参考左移

逻辑运算

  • cmp
// cmp destination,sourceCMP结果       ZF CF
目的操作数 < 源操作数  0  1
目的操作数 > 源操作数  0  0
目的操作数 = 源操作数  1  0mov ax,8
cmp ax,9     ; ZF = 0 and CF = 1 mov ax,8
cmp ax,8     ; ZF = 1 and CF = 0
  • test
TEST EAX,EAX    // 判断eax是否为零,其实也可以用cmp,但是test占字节更少

串操作

参考自:https://blog.csdn.net/waitforc/article/details/6908968

  • repe cmpsb => memcmy(ESI, EDI, ECX)

  • repe stosb => memset(EDI, AL, ECX),常与 xor eax,eax 联用

  • repe movsb => memcpy(ESI, EDI, ECX)

  • repe scasb => 用于在一段缓冲区(EDI)中搜索一个字节(AL),ECX设置为缓冲区长度

  • lods esi 赋值到 eax b:byte w:word d:dword

  • stos eax 赋值到 edi b:byte w:word d:dword

JCC

写到这实在是犯懒, 就参考吧:https://blog.csdn.net/fengshh2301/article/details/53327195

  • a : above;b : below;c : carry(小于);e : equal;g : greater;l : less;C 当作 CF, 其他诸如 S,SF,N即 not 等。。。

寻址方式

  • 1立即数寻址,操作数就在指令中,作为指令的一部分,即01H,1204H
MOV EAX,1
  • 2寄存器寻址,操作数在寄存器中;指令中指定寄存器,即ECX
MOV EAX,ECX
  • 3直接寻址,操作数在内存单元中,指令直接包含操作数的有效地址
MOV EAX,DWORD PTR DS:[0X1234567]
  • 4寄存器间接寻址,操作数的有效地址在ESI、EDI、EBX、EBP这4个寄存器之一中;在不采用段前缀的情况下, 对于ESI、EDI、EBX默认段为DS,而EBP为SS
MOV EAX,DWORD PTR [EBX]
  • 5寄存器相对寻址
MOV EAX,DWORD PTR [ESI + 0x0C]
  • 6基址变址寻址
MOV EAX,DWORD PTR [EBX + ESI]
  • 7相对基址变址寻址
MOV EAX,DWORD PTR [EBX + ESI + 0x0C]

调用约定

  • cdcel:调用者平衡,即函数外要 add esp,xx;参数由右向左进栈

  • stdcall:被调用者平衡(函数自平衡);参数由右向左进栈

  • fastcall:被调用者平衡;前两个参数由 ecx,edx传递,其余由右向左进栈

  • thiscall:被调用者平衡;ecx 传递 this 指针,参数由右向左进栈

汇编是逆向的基础,太重要了;把笔记上的又总结了一遍,如有错误,欢迎指正~~互相进步,逆向路漫漫

x86汇编语言复习总结相关推荐

  1. 任务切换——《x86汇编语言:从实模式到保护模式》读书笔记38

    任务切换--<x86汇编语言:从实模式到保护模式>读书笔记38 本文及后面的几篇博文是原书第15章的学习笔记. 本章依然使用第13章的主引导程序. 1. 协同式多任务与抢占式多任务 有两种 ...

  2. 任务和特权级保护(三)——《x86汇编语言:从实模式到保护模式》读书笔记34

    任务和特权级保护(三)--<x86汇编语言:从实模式到保护模式>读书笔记34 5.2.7 在GDT中创建LDT描述符 处理器要求在GDT中安装每个LDT的描述符.当要使用这些LDT时,可以 ...

  3. 程序的加载和执行(六)——《x86汇编语言:从实模式到保护模式》读书笔记26

    程序的加载和执行(六)--<x86汇编语言:从实模式到保护模式>读书笔记26 通过本文能学到什么? NASM的条件汇编 用NASM编译的时候,通过命令行选项定义宏 Makefile的条件语 ...

  4. 程序的加载和执行(四)——《x86汇编语言:从实模式到保护模式》读书笔记24

    程序的加载和执行(四)--<x86汇编语言:从实模式到保护模式>读书笔记24 通过本文能学到什么? 怎样跳转到用户程序 用户程序通过调用内核过程完成自己的功能 怎样从用户程序返回到内核 接 ...

  5. 程序的加载和执行(一)——《x86汇编语言:从实模式到保护模式》读书笔记21

    程序的加载和执行(一) 本文及之后的几篇博文是原书第13章的学习笔记. 本章主要是学习一个例子,对应的代码分为3个文件: ;代码清单13-1;文件名:c13_mbr.asm;文件说明:硬盘主引导扇区代 ...

  6. 【OS修炼指南目录】----《X86汇编语言-从实模式到保护模式》读书笔记目录表

    学习交流加(可免费帮忙下载CSDN资源): 个人微信: liu1126137994 学习交流资源分享qq群1(已满): 962535112 学习交流资源分享qq群2: 780902027 本文是将个人 ...

  7. AM335X的汇编语言与c语言,X86汇编语言学习手记 -- 汇编和C协同

    X86汇编语言学习手记(3) 2004年12月 在X86汇编语言学习手记(1)(2)中,可以看到栈(Stack)作为进程执行过程中数据的临时存储区域,通常包含如下几类数据: 局部变量 函数调用的返回地 ...

  8. x86汇编语言从实模式百度云_Intel x86 CPU 32位保护模式杂谈之任务切换 上

    目录: 什么是任务 任务由什么组成 任务门描述符是什么东东?有了TSS描述符为什么要有任务门描述符? 参考文献 什么是任务 任务(task)是处理器可以分配.执行.挂起的工作单位,笔者认为和我们操作系 ...

  9. linux平台学x86汇编语言学习集合帖

    linux平台学x86汇编语言学习集合帖 linux平台学x86汇编(一):https://blog.csdn.net/shallnet/article/details/45543237 linux平 ...

最新文章

  1. 在Unity中制作4种不同的游戏
  2. python判断实例的类型
  3. 分享GitHub上一些嵌入式相关的高星开源项目
  4. java判断一个文件有多少行_Java关于条件判断练习--统计一个src文件下的所有.java文件内的代码行数(注释行、空白行不统计在内)...
  5. FFmpeg4.0.2 over版本av_register_all()流程(二十九)
  6. 上海医疗救治专家组组长:没有讨价还价!
  7. 侧信道攻击之模板攻击
  8. html5制作人物动作,骨骼动画制作新利器:快速制作动作人物动画,省时简单!...
  9. 短视频社交应用Socialcam关闭背后,是又一个圈钱阴谋?
  10. Excel 宏的用法的教程
  11. hive-创建数据库-创建表--hive版本3.1.2
  12. 同济大学计算机科学与技术系,同济大学计算机科学与技术系简介_跨考网
  13. Android Studio 安装应用失败总结
  14. 9大论坛、多项AI创新成果,Imagination邀您共聚 AIIA2020人工智能开发者大会
  15. 电路设计_铝电解电容的失效原因
  16. Loaded plugins: fastestmirror, langpacks Loading mirror speeds from cached hostfile Could not retrie
  17. MTK平台MT6765 LCM屏调试步骤
  18. 中国工商银行网银不能识别U盾或打不开网页
  19. 记 计算机 科学学院 教师,永做学生的操作系统——记计算机科学技术学院、软件学院教师金虎...
  20. HAL库中断方式实现串口通信操作

热门文章

  1. 营销软文写作_软文营销写作_软文写作服务_智能写作服务商|Giiso智搜
  2. 易语言snmp_易语言教程
  3. 2、用Kettle生成日期维度数据(一)使用kettle生成2019年日期文件保存到hive表中
  4. 樊刚市场化指数-含总指标及各分项指标Stata do文件和计算数据(1997-2022年)
  5. MathType使用中提示There was a problem sending your equation preferences for this document to MathType
  6. 龙梦3A4000代码获Kernel 5.5合并
  7. 推广下自己的JAVA开源游戏服务端框架
  8. Jackson 化学发光免疫印迹解决方案
  9. 用户流失,该怎么分析?
  10. 软件测试书清华大学出版社,清华大学出版社-图书详情-《软件测试技术与实践》...