当前位置: 首页 > news >正文

汇编基础

汇编基础

  • 每一种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

相关文章:

  • 记得那份好
  • Java8 之 新的时间日期 API
  • C 语言从回忆到重识 -- 0 回忆
  • 教师节感言
  • 使用设备安全管理器配置设备安全策略
  • C 语言从回忆到重识 -- 1基础知识
  • 祝福(上)
  • C 语言从回忆到重识 -- 2 进阶知识之函数、数组与指针
  • 关于MS SQL 2005和C#远程连接的详细设置
  • C 语言从回忆到重识 -- 附录
  • C# 3.0语言规范
  • 使用CLion调试redis源码
  • C# 3.0 入门系列(一)
  • C 与 多线程(1)
  • C# 3.0入门(二)
  • Google 是如何开发 Web 框架的
  • 实现windows 窗体的自己画,网上摘抄的,学习了
  • 2018天猫双11|这就是阿里云!不止有新技术,更有温暖的社会力量
  • C++类的相互关联
  • JavaScript函数式编程(一)
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • Vue 动态创建 component
  • vue脚手架vue-cli
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 诡异!React stopPropagation失灵
  • 聊一聊前端的监控
  • 软件开发学习的5大技巧,你知道吗?
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 数据科学 第 3 章 11 字符串处理
  • 微信小程序--------语音识别(前端自己也能玩)
  • 学习ES6 变量的解构赋值
  • 一些css基础学习笔记
  • 源码之下无秘密 ── 做最好的 Netty 源码分析教程
  • FaaS 的简单实践
  • HanLP分词命名实体提取详解
  • raise 与 raise ... from 的区别
  • 京东物流联手山西图灵打造智能供应链,让阅读更有趣 ...
  • ​2021半年盘点,不想你错过的重磅新书
  • #### go map 底层结构 ####
  • #中的引用型是什么意识_Java中四种引用有什么区别以及应用场景
  • (12)Hive调优——count distinct去重优化
  • (Arcgis)Python编程批量将HDF5文件转换为TIFF格式并应用地理转换和投影信息
  • (done) 两个矩阵 “相似” 是什么意思?
  • (七)c52学习之旅-中断
  • (转)memcache、redis缓存
  • (轉貼) UML中文FAQ (OO) (UML)
  • .net core MVC 通过 Filters 过滤器拦截请求及响应内容
  • .net refrector
  • .net反编译工具
  • .NET高级面试指南专题十一【 设计模式介绍,为什么要用设计模式】
  • .net解析传过来的xml_DOM4J解析XML文件
  • 。Net下Windows服务程序开发疑惑
  • /etc/fstab和/etc/mtab的区别
  • ?php echo ?,?php echo Hello world!;?
  • @Builder用法