编译与汇编
本文来自《程序员的自我修养》
编译过程是把预处理完的文件进行一系列词法分析,语法分析,语义分析以及优化后生成相应的汇编文件代码。
现在版本的GCC把预编译和编译两个步骤合并为一个步骤。
gcc -S HelloWorld.c HelloWorld.s
int main()
{//test/* test */return 0;
}
.file "HelloWorld.c".text.globl main.type main, @function
main:
.LFB0:.cfi_startprocendbr64pushq %rbp.cfi_def_cfa_offset 16.cfi_offset 6, -16movq %rsp, %rbp.cfi_def_cfa_register 6movl $0, %eaxpopq %rbp.cfi_def_cfa 7, 8ret.cfi_endproc
.LFE0:.size main, .-main.ident "GCC: (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0".section .note.GNU-stack,"",@progbits.section .note.gnu.property,"a".align 8.long 1f - 0f.long 4f - 1f.long 5
0:.string "GNU"
1:.align 8.long 0xc0000002.long 3f - 2f
2:.long 0x3
3:.align 8
4:
------------
对于C语言的代码来说,这个预编译和编译的程序是cc1,
对于C++来说,对应的程序是cc1plus;
实际上gcc这个命令只是这些后台程序的封装,它会根据不同的参数要求去调用预编译编译程序cc1,汇编器as,链接器ld.
--------------
汇编器将汇编代码转变为机器可以执行的指令,每一个汇编代码几乎都对应一条机器指令,所以汇编器的汇编过程相对于编译器来说比较简单,没有复杂的语法,没有语义,不需要做指令优化;
只是根据汇编指令和机器指令的对照表一一翻译即可。
gcc -c HelloWorld.s -o HelloWorld.o
把汇编代码转为机器指令。
----------
机器指令是计算机能够直接理解和执行的最基本的命令。它们通常以二进制形式存在,是硬件与软件交互的桥梁。每一条机器指令都对应着处理器上的一个特定的操作,比如数据传输、算术计算、控制操作等。
以下是机器指令的一些基本特点:
-
二进制格式:机器指令通常由一系列的二进制数表示,这些二进制数可以被计算机的CPU直接解读。
-
操作码:每条机器指令都包含一个操作码(Opcode),它指定了CPU要执行的操作类型,如加法、减法、移动数据等。
-
操作数:大多数指令还包括一个或多个操作数,这些操作数指定了数据的位置,例如寄存器、内存地址或者指令中直接包含的常数。
-
指令长度:不同架构的CPU,其机器指令的长度可能不同。有的指令可能是固定长度的,而有的可能是变长的。
-
执行顺序:机器指令通常按照它们在存储器中的顺序执行,除非遇到跳转指令或者其他改变执行流程的指令。
以下是一些常见的机器指令类型:
- 数据传输指令:如MOV(移动数据),用来在寄存器与内存之间或者寄存器之间传输数据。
- 算术指令:如ADD(加法)、SUB(减法)、MUL(乘法)、DIV(除法)等,用于执行数学运算。
- 逻辑指令:如AND、OR、NOT、XOR等,用于执行逻辑运算。
- 控制流指令:如JMP(跳转)、JE(等于时跳转)、JNE(不等于时跳转)等,用于改变程序的执行顺序。
程序员通常使用高级编程语言来编写程序,然后通过编译器或解释器转换成机器指令,计算机才能执行这些程序。机器指令直接与硬件相关,因此它们在不同的计算机架构之间通常是不同的。
-------------
MOV 既可以作为机器指令,也可以作为汇编指令。
在汇编语言中,MOV 是一个汇编指令,它用于指示处理器将数据从一个位置移动到另一个位置。当程序员编写汇编语言程序时,他们使用 MOV 这样的助记符来表示他们想要执行的数据移动操作。
当汇编语言程序被汇编器(assembler)转换成机器代码时,MOV 汇编指令会被翻译成对应的机器指令。这个机器指令是处理器可以直接执行的二进制编码,它具体表示了移动数据的操作。
所以,MOV 在汇编语言层面是一个汇编指令,而在机器代码层面则对应一个或多个具体的机器指令。不同的处理器架构可能会有不同的机器指令来执行 MOV 操作。例如,在 x86 架构中,MOV 汇编指令会对应于一个特定的机器指令操作码,而在 ARM 架构中,它可能对应于不同的机器指令操作码。
相关文章:
编译与汇编
本文来自《程序员的自我修养》 编译过程是把预处理完的文件进行一系列词法分析,语法分析,语义分析以及优化后生成相应的汇编文件代码。 现在版本的GCC把预编译和编译两个步骤合并为一个步骤。 gcc -S HelloWorld.c HelloWorld.sint main() {//test/* …...
对MySQL滴MVCC理解(超详细)
学习目标 什么是MVCC?MVCC的核心概念MVCC 的工作原理MVCC 的优势MVCC 的劣势 什么是MySQL中InnoDB下滴快照读和当前读?一、快照读(Snapshot Read)二、当前读(Current Read)三、快照读和当前读的区别四、当前…...
Mac玩Steam游戏秘籍!
Mac玩Steam游戏秘籍! 大家好!最近有不少朋友在用MacBook玩Steam游戏时遇到不支持mac的问题。别担心,我来教你如何用第三方工具Crossover来畅玩这些不支持的游戏,简单又实用! 第一步:下载Crossover 首先&…...
matlab实现了一个优化的遗传算法,用于求解注汽站最优位置的问题
function [best_chromosome, best_fitness] optimized_genetic_algorithm()%% 遗传算法参数初始化% 定义井信息,包括坐标、管道长度、流量、压力等wells defineWells(); % 返回井的结构体数组N length(wells); % 注汽井数量% 遗传算法相关参数L_chromosome 20; …...
电商项目-基于ElasticSearch实现商品搜索功能(三)
本系列文章主要介绍基于 Spring Data Elasticsearch 实现商品搜索的后端代码,介绍代码逻辑和代码实现。 主要实现功能:根据搜索关键字查询、条件筛选、规格过滤、价格区间搜索、搜索查询分页、搜索查询排序、高亮查询。 主要应用技术:canal,…...
【Vim Masterclass 笔记12】S06L26 + L27:Vim 文本的搜索、查找及替换同步练习(含点评课)
文章目录 S06L26 Exercise 07 - Search, Find, and Replace1 训练目标2 操作指令2.1. 打开 search-practice.txt 文件2.2. 同一行内的搜索练习2.3. 当前文件内的搜索练习2.4. 单词搜索练习2.5. 全局替换练习 3 退出 Vim S06L27 同步练习点评课 写在前面 Vim 的文本检索、查找与…...
Jsoup实现实时爬取
文章目录 1.作用2.使用pom文件引入示例代码(来自官网) 3.测试代码4.上线代码控制层业务层 1.作用 获取Html文档,然后解析出需要的字段 2.使用 pom文件引入 <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-redi…...
如何在Ubuntu上安装Cmake
前言 本文主要阐述如何在Ubuntu22.04上面安装cmake,具体可看下面的操作。 正文 一、环境 Ubuntu22.04 cmake-3.31.4.tar.gz 二、步骤 参考这个方案: 【运维】Ubuntu如何安装最新版本的Cmake,编译安装Cmake,直接命令安装…...
图解Git——分支开发工作流《Pro Git》
分支开发工作流 由于分支管理的便捷, 才衍生出这些典型的工作模式,你可以根据项目实际情况选择。 1. 长期分支 适用于持续开发和发布周期长的项目。常见的长期分支包括: master:只保留稳定的代码,通常用于生产环境。…...
没有正确使用HTTP Range Request,导致访问Azure Blob存储的视频没有实现流式播放
引文: 组里的小伙伴在修改视频播放相关的代码,修改之前的方案使用CDN转发,可以实现流式播放,修改之后的代码因为没有正确的使用Http Range Request, 导致画面访问Azure Blob存储的视频没有实现流式播放,整理下线索在这…...
回归预测 | MATLAB实RVM相关向量机多输入单输出回归预测
回归预测 | MATLAB实RVM相关向量机多输入单输出回归预测 目录 回归预测 | MATLAB实RVM相关向量机多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 RVM-Adaboost相关向量机集成学习多输入单输出回归预测是一种先进的机器学习方法,用于处理…...
开发人员学习书籍推荐(C#、Python方向)
作为一名开发人员,持续学习和提升自己的技术水平是至关重要的。如今,技术不断更新换代,新的开发框架、语言和工具层出不穷。对于刚入行的开发者或希望深入某一领域的工程师来说,选对书籍是学习的捷径之一。本篇文章将推荐一些经典…...
Springboot + vue 小区物业管理系统
🥂(❁◡❁)您的点赞👍➕评论📝➕收藏⭐是作者创作的最大动力🤞 💖📕🎉🔥 支持我:点赞👍收藏⭐️留言📝欢迎留言讨论 🔥🔥&…...
基于深度学习的视觉检测小项目(十二) 使用线条边框和渐变颜色美化界面
到目前为止,已经建立起了基本的项目架构,样式表体系也初步具备,但是与成品的界面相比,还是差点什么。 我的界面效果图: 优秀demo的界面截图: 是的,我的界面太“平” 了,没有立体感&…...
基于OQuPy的量子编程实例探究:理论、实践与展望
基于OQuPy的量子编程探究:理论、分析与实践 一、引言 1.1 研究背景与意义 近年来,量子计算作为一种革命性的计算范式,在科学界与产业界引发了广泛关注。它依托量子力学原理,运用量子比特(qubit)进行信息处理,与传统计算相比,具备并行处理、指数级加速等显著优势,为解…...
【数据库】二、关系数据库
文章目录 二、关系数据库1 关系2 关系数据库3 完整性约束4 关系运算 二、关系数据库 1 关系 域:一组具有相同数据类型的值的集合。 笛卡尔积:所有域(域可相同)中所有取值的组合 例如:D1{1,2,3},D2{A,b}&…...
C#类型转换
C#是静态类型的语言,变量一旦声明就无法重新声明或者存储其他类型的数据,除非进行类型转换。本章的主要任务就是学习类型转换的知识。类型转换有显式的,也有隐式的。所谓显式,就是我们必须明确地告知编译器,我们要把变…...
【Vue】Vue组件--上
目录 一、组件基础 二、组件的嵌套关系 1. 基础架构 2. 嵌套 三、组件注册方式 1. 局部注册: 2. 全局注册: 四、组件传递数据 1. 基础架构 2. 传递多值 3. 动态传递数据 五、组件传递多种数据类型 1. Number 2. Array 3. Object 六、组…...
21、Transformer Masked loss原理精讲及其PyTorch逐行实现
1. Transformer结构图 2. python import torch import torch.nn as nn import torch.nn.functional as Ftorch.set_printoptions(precision3, sci_modeFalse)if __name__ "__main__":run_code 0batch_size 2seq_length 3vocab_size 4logits torch.randn(batch…...
构建高性能网络服务:从 Socket 原理到 Netty 应用实践
1. 引言 在 Java 网络编程中,Socket 是实现网络通信的基础(可以查看我的上一篇博客)。它封装了 TCP/IP 协议栈,提供了底层通信的核心能力。而 Netty 是在 Socket 和 NIO 的基础上,进一步封装的高性能、异步事件驱动的…...
铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...
【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序
一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...
前端中slice和splic的区别
1. slice slice 用于从数组中提取一部分元素,返回一个新的数组。 特点: 不修改原数组:slice 不会改变原数组,而是返回一个新的数组。提取数组的部分:slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...
ubuntu系统文件误删(/lib/x86_64-linux-gnu/libc.so.6)修复方案 [成功解决]
报错信息:libc.so.6: cannot open shared object file: No such file or directory: #ls, ln, sudo...命令都不能用 error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory重启后报错信息&…...
加密通信 + 行为分析:运营商行业安全防御体系重构
在数字经济蓬勃发展的时代,运营商作为信息通信网络的核心枢纽,承载着海量用户数据与关键业务传输,其安全防御体系的可靠性直接关乎国家安全、社会稳定与企业发展。随着网络攻击手段的不断升级,传统安全防护体系逐渐暴露出局限性&a…...
