汇编基础

汇编基础

  • 每一种CPU都有自己的机器指令集\汇编指令集,所以汇编语言不具备可移植性;
  • 因为汇编和操作系统平台相关,所以汇编语言没有移植性;

汇编分类:

  • 8086汇编(8086处理器是16bit的CPU)
  • Win32汇编
  • Win64汇编
  • ARM汇编(嵌入式、Mac、iOS)

计算机内部模型:
- https://upload-images.jianshu.io/upload_images/2990730-cb3c46652c7bad8e.png?imageMogr2/auto-orient/strip|imageView2/2/w/550/format/webp

CPU 的组成:

  • 寄存器
    • pc寄存器(program counter 指令指针寄存器)
    • 变址寄存器
      • ESI 称为源变址寄存器,通常存放要处理的数据的内存地址
      • EDI 称为目的变址寄存器,通常存放处理后的数据的内存地址。
      • ESI 和 EDI 常用来配合使用完成数据的赋值操作
    • 指针寄存器
      • EBP 基址寄存器 常用来代替堆栈指针访问堆栈中的数据
      • ESP 堆栈指针寄存器 存放当前堆栈栈顶的地址
      • EIP 指令指针寄存器
      • 一般情况下,ESP 和 EBP 联合使用来访问函数中的参数和局部变量
    • 标志寄存器
      • EFLAGS寄存器
        • OF(Overflow Flag):溢出标志,溢出时为1,否则置0。
        • DF (Direction Flag):方向标志,在串处理指令中控制信息的方向。
        • IF (Interrupt Flag) :中断标志
        • AF (Auxiliary carry Flag) :辅助进位标志,有进位时置1,否则置0。
        • ZF (Zero Flag) :零标志,运算结构为0时ZF位位置1,否则置0。
        • SF (Sign Flag):符号标志,结果为负时置1,否则置0。
        • CF (Carry Flag): 进位标志,进位时置1,否则置0。
        • PF (Parity Flag): 奇偶标志。结果操作数中1的个数为偶数时置1,否则置0。
  • 运算器
  • 控制器

寻址方式:

  • 立即寻址
  • 直接寻址
  • 寄存器寻址
  • 寄存器相对寻址
  • 基址加变址寻址
  • 相对基址加变址寻址

IA-32(Intel Architecture)

  • 英特尔体系架构,英特尔从486开始采用,也叫X86-32架构
  • 有4个32位寄存器,用于保存临时数据,它们分别是EAX、EBX、ECX和EDX (这4个32位寄存器的通用寄存器名字前面都有一个“E”字母,含义是“Expand”扩展,这是由于在16位的时代,这4个通用寄存器的名字是AX、BX、CX和DX,到了32位后就在它们的名字前面加个“E”来区别是32位还是16位。)
    • EAX寄存器:EAX称为累加器,常用于算数运算、布尔操作、逻辑操作、返回函数结果等
    • EBX寄存器:EBX称为基址寄存器,常用于存档内存地址
    • ECX寄存器:ECX称为计数寄存器,常用于存放循环语句的循环次数,字符串操作中也常用
    • EDX寄存器:称为数据寄存器,常常和EAX一起使用
  • IA-32架构的汇编语言常见有两种格式
    • Intel格式
      • 指令名称 目标操作数DST,源操作数SRC
      • Mov eax,[edx] //将内存地址为EDX的数据放入EAX寄存器
    • AT&T格式
      • 指令名称 源操作数SRC,目标操作数DST
      • Mov (%EDX),%EAX //将内存地址为EDX的数据放入EAX寄存器

x86 组装指南

  • http://www.cs.virginia.edu/~evans/cs216/guides/x86.html
  • https://www.felixcloutier.com/x86/

坐标

  • 北纬33°27′至33°47′,东经115°53′至116°33′
  • 北纬34°9′ 至35°34′,东经107°38′至109°10′

常用指令

  • MOV 数值传送指令
    • 格式是“MOV DST,SRC” 将源操作数SRC传送到目的操作数DST中
  • XCHG 交换指令,实现寄存器间和内存间的数据交换
    • 格式是“XCHG DST,SRC”。XCHG指令交换SRC和DST之间的数据
  • PUSH 压入堆栈指令
  • POP 弹出堆栈指令

gcc -S example.c

int add_a_and_b(int a, int b) {
   return a + b;
}
_add_a_and_b:
   push   %ebx
   mov    %eax, [%esp+8] 
   mov    %ebx, [%esp+12]
   add    %eax, %ebx 
   pop    %ebx 
   ret  

参考资料:

  • http://www.ruanyifeng.com/blog/2018/01/assembly-language-primer.html
  • https://www.jianshu.com/p/47b750455ab5
  • https://blog.csdn.net/cg2258911936/article/details/102598631
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值