🎈
快乐笔记 HappyNotes-综合基础科学学习笔记集
  • 前言
  • 计算机
    • 语言
      • 汇编
        • 基础
          • 概念
          • 指令集
        • x86
        • amd64
      • C
      • C++
      • Rust
        • 基础
          • 语法
            • 函数
            • 字面量
            • 流程控制
            • 闭包
            • 静态变量
            • 迭代器
            • 运算符
            • Result枚举
            • Option枚举
            • Page 17
            • Page 16
            • Page 9
          • 指针
          • 进程
          • 内存
          • 指针
          • 网络
          • 数学运算
          • 环境与配置
          • 工程组织管理
          • WASM
          • IO
          • FFI
            • 基础
            • 库
            • cbindgen
        • 标准库
      • Java
        • JDK
          • JUC
            • 基础
              • 基础
              • 相关链接
            • 集合
              • ConcurrentHashMap
              • 基础
      • Solidity
        • 基础
          • EIP标准
          • 可升级合约
          • 变量
          • 存储位置
          • 常量
        • 框架
          • OpenZeppelin
            • 基础
            • API
            • 常用操作
            • Page 19
          • UniSwap
          • PancakeSwap
        • 工具链
          • Hardhat
          • Truffle
        • IDE
          • Remix
      • Go
      • Javascript
      • Typrscript
      • Zig
      • Python
      • SQL
      • Lisp
      • 脚本
        • 正则表达式
        • bat
        • markdown
        • shell
        • toml
        • yaml
    • OS
      • 基础
        • 空间
      • Linux
        • 基础
        • 内核
        • 命名空间
        • 文件系统
        • 命令
        • 进程系统
        • 工具
        • 三方版本
          • Kali
            • metasploit
          • Ubantu
      • MacOS
      • Windows
      • 工具
        • make
        • netcat
    • 存储
      • 搜索引擎
        • OpenSearch
        • ZincSearch
      • 存储系统
        • IPFS
        • Etcd
      • 基础
      • 数据库
        • 工具
        • 区块链
        • 非关系型
        • 关系型
        • 列型
        • 图型
        • 数据仓库
    • 前端
    • 移动端
      • Android
      • IOS
    • 区块链
      • 原理
      • Page 4
      • 公链架构
        • Ethereum
          • 基础
            • 交易
            • Page 15
            • Page 14
            • Page 13
            • Page 12
          • ETH2.0
            • 升级路线
            • 名词解释
            • Page 11
            • Page 10
          • 节点
          • 链桥
          • Page 8
          • Page 7
          • Page 6
        • Page 5
      • 存储架构
      • L2架构
      • Defi
      • 工具
      • Page 2
      • Page 1
      • Page
      • Page 3
    • 文件系统
      • 基础
      • NTFS
    • 系统架构
      • cex-架构
      • 仓储系统
    • 中间件
      • Web3
        • Moralis
      • 搜索
        • Algolia
      • AI
      • Consul
      • FFmpeg
      • MeiliSearch
      • 运维
        • K8s
          • 基础
          • 命令
    • 协议
      • RTMP
    • 密码学
    • 数据结构
    • 算法
    • 编译器
      • LLVM
    • 服务器
      • JBoss
      • Jetty
      • Nginx
      • Tomcat
      • Underow
    • 名词解释
    • 硬件
    • 信息论
    • 网络
    • 容器
    • AI
    • 内存
    • 安全
    • 分布式
    • 工具
      • Git
  • 基础科学
    • 电子信息
      • 模拟电路
      • 数字电路
      • 信号
    • 物理
    • 化学
    • 机械
      • 汽车
      • 发动机
      • 发射装置
      • 飞行器
      • 火箭
    • 金融
      • 基础
        • 劣后与优先
        • VIE架构
      • 技术指标
        • 斐波那契回撤
        • 蜡烛图(OHLC)
        • 贝塔系数
        • 斐波那契速度阻力扇
        • 斐波那契趋势时间
        • 斐波那契速度阻力弧
        • 斐波那契楔形
        • 斐波那契圈
        • 斐波那契时区
      • 债务理论
    • 数学
      • 基础
        • 概念
        • 规范
        • 数
        • 运算
          • 四则运算
          • 解析式
          • 幂运算
          • 因数分解
      • 代数
      • 方程
        • 二元一次方程
        • 一元二次方程
        • 分式方程
        • 不等式
        • 一次函数
        • 二次函数
        • 三元一次方程
        • 三角函数
        • 一元一次方程
        • 反比例函数
      • 概率与统计
      • 高等数学
      • 工具
    • 易经
      • 爻卦
  • 法律
    • 公司法
    • 管制刀具认定标准
    • 物权法
    • 刑法
    • 知识产权法
  • 人类语言
Powered by GitBook
On this page
  • 指令
  • push
  • 案例
  • 编译结果
  1. 计算机
  2. 语言
  3. 汇编
  4. 基础

指令集

Previous概念Nextx86

Last updated 1 year ago

指令

push

根据约定,程序从_main标签开始执行,这时会在 Stack 上为main建立一个帧,并将 Stack 所指向的地址,写入 ESP 寄存器。后面如果有数据要写入main这个帧,就会写在 ESP 寄存器所保存的地址。

push指令用于将运算子放入 Stack.

push 3

将3写入main这个帧。

push指令其实有一个前置操作。它会先取出 ESP 寄存器里面的地址,将其减去4个字节,然后将新地址写入 ESP 寄存器。使用减法是因为 Stack 从高位向低位发展,4个字节则是因为3的类型是int,占用4个字节。得到新地址以后, 3 就会写入这个地址开始的四个字节。

push 2

第二行也是一样,push指令将2写入main这个帧,位置紧贴着前面写入的3。这时,ESP 寄存器会再减去 4个字节(累计减去8)。

图解

案例

int add_a_and_b(int a, int b) {
   return a + b;
}

int main() {
   return add_a_and_b(2, 3);
}
gcc -S *.c

编译结果

_add_a_and_b:
   push   %ebx
   mov    %eax, [%esp+8] 
   mov    %ebx, [%esp+12]
   add    %eax, %ebx 
   pop    %ebx 
   ret  

_main:
   push   3
   push   2
   call   _add_a_and_b 
   add    %esp, 8
   ret

原程序的两个函数add_a_and_b和main,对应两个标签_add_a_and_b和_main。每个标签里面是该函数所转成的 CPU 运行流程。 每一行就是 CPU 执行的一次操作。它又分成两部分,就以其中一行为例。

push %ebx

这一行里面,push是 CPU 指令,%ebx是该指令要用到的运算子。一个 CPU 指令可以有零个到多个运算子。 下面我就一行一行讲解这个汇编程序,建议读者最好把这个程序,在另一个窗口拷贝一份,省得阅读的时候再把页面滚动上来。