汇编与内联 x86-64
机器字长
x86是32位系统
64是64位系统
这里的32和64,指的都是机器字长
机器字长是
- 能直接进行整数/位运算的大小
- 指针的大小(索引内存的范围)
容易与机器字长混淆的概念:字
字
字=存储字长
字是MDR寄存器的位数,代表每个主存存储体中的存储单元可以存放的数据位数
8位机
由于空间大小限制,想要把集成电路做到个人主机里,只能用8位字长的
16位机
8086 IBMPC
32位机
Intel x86
64位机
32位到64位中间度过了很长的时间

C语言int类型

ABI
Application Binary Interface
计算机中的ABI是指应用程序二进制接口,它是编译器和链接器遵守的一组规则,以让编译后的程序可以正常工作。ABI里包含很多方面的内容,比如函数的调用顺序、数据类型的表示、可执行文件的格式、虚拟地址空间布局等等。不同的处理器体系结构有不同的ABI规范,例如X86和X86_64。ABI对于程序的兼容性和效率有重要的影响。
需求
gcc clang 编译出的程序能否互相链接
gcc 不同版本下 编译出的程序能否互相链接
C 和 C++ 的代码能否互相链接
实现
在linux下的 cdecl
在win32下的 stdcall

汇编
esp寄存器
计算机的esp寄存器是一个用来存储栈顶地址的寄存器。它可以指向内存单元,也可以指向内存单元之间的缝隙。它的值会随着栈的入栈和出栈操作而改变。它可以帮助CPU从栈中读取数据或指针。
eip寄存器
计算机的eip寄存器是一个用来存储下一条指令地址的寄存器。它可以帮助CPU从内存中读取指令并执行。它的值会随着指令的执行而改变。它和esp寄存器的区别是,esp寄存器是用来存储栈顶地址的寄存器,而eip寄存器是用来存储指令地址的寄存器。
汇编指令 sub $0x18,%esp
- sub是减法指令,它表示将两个操作数相减,结果存放在第一个操作数中。
- $0x18是一个立即数,它表示十六进制的18,也就是十进制的24。
- %esp是一个寄存器,它表示栈指针,也就是指向栈顶的地址。
- sub $0x18,%esp表示将栈指针减去24,也就是向下移动栈顶24个字节,相当于在栈上分配了24个字节的空间。在32位汇编(x86架构)中,机器字长为32位,等于4字节,也就是向下移动了6个栈帧。
- 这个指令通常用于函数的开头,为函数的局部变量或参数预留空间。
eax寄存器
计算机的eax寄存器是:
- 一个32位的通用寄存器,用于临时存储数据和内存访问。
- 一个累加器,用于在乘法和除法指令中被自动调用。
- 一个返回函数结果的寄存器,在win32中,一般用于保存函数的返回值。
- 一个可以拆分的寄存器,它的低16位是ax,ax的高8位是ah,低8位是al。
- 是64位寄存器rax的低32位
汇编指令 mov %esp,%eax
esp指向的地址的值移动到eax指向的地址
汇编指令 lea 0x1c(%esp),%eax
lea是load effective address的缩写,意思是加载有效地址。它的作用是把一个内存地址表达式的值(而不是该地址处的内容)存入一个寄存器。例如,lea eax, [ebx+4ecx]就是把ebx+4ecx的结果(一个地址值)存入eax寄存器,而不是把该地址处的数据存入eax寄存器。lea指令可以用来进行一些简单的算术运算,比如乘法和加法。

lea 0x1c(%esp),%eax
就是把esp上移0x1c个地址(7个栈帧),然后把这个地址值传给eax
汇编指令 push %eax
汇编指令 push 是将源操作数复制到堆栈中,同时减少栈指针 ESP 的值
就是把eax寄存器的值放到esp指向的栈帧地址,然后把esp下移1个栈帧
而结合上一步lea的指令来看,eax寄存器存放的是eap上移7个栈帧的地址
汇编指令 call 510 <bar>
把返回地址放到esp指向的位置,然后esp下移1个栈帧。
寄存器


64位不再用堆栈去传递参数,直接用6个参数寄存器去传递


rip寄存器
rip寄存器是一个64位的指令指针寄存器,用来保存当前正在执行的指令的地址或下一条要执行的指令的地址。rip寄存器可以用来实现一种新的寻址模式,称为rip相对寻址,使用这个模式,有效地址的计算方式变为rip(指向下一条指令)加上位移量。

汇编命令lea (%rdi,%rsi,1) %r9d。lea是load effective address的缩写,意思是加载有效地址。它的作用是把一个内存地址计算出来,然后存放到目的寄存器中2。它不会访问内存,也不会改变标志位。在这个命令中,%r9d是目的寄存器,(%rdi,%rsi,1)是源操作数,表示一个内存地址。这个地址的计算方法是把%rdi和%rsi的值相加,然后乘以1(即不变),再加上一个偏移量(如果有的话)。在这里没有偏移量,所以就是%rdi+%rsi。所以这个命令的意思是把%rdi+%rsi的结果存放到%r9d中。这个命令可能用于计算数组元素的地址或者进行简单的算术运算。

bss是计算机编程中的一个术语,表示包含静态分配的未初始化变量的内存区域。bss的全称是block started by symbol,源自IBM 704的汇编语言。bss区域通常不占用目标文件的空间,而是由程序加载器在加载程序时分配内存。bss区域中的变量通常被初始化为零或空指针。在C语言中,如果一个静态分配的对象没有显式的初始值,它就会被放在bss区域。
inline assembly
inline assembly是一种编译器的特性,它允许在C或C++程序中使用asm关键字嵌入汇编语言的源代码 。它在C中是有条件支持和实现定义的,但在C++中不支持。它可以使用作用域内的任何变量或函数名,比单独的汇编器更方便。它通常用于提高速度,经常用于系统编程。
相关文章:
汇编与内联 x86-64
机器字长 x86是32位系统 64是64位系统 这里的32和64,指的都是机器字长 机器字长是 能直接进行整数/位运算的大小指针的大小(索引内存的范围) 容易与机器字长混淆的概念:字 字 字存储字长 字是MDR寄存器的位数,代表每个主存存储体中的存储…...
OSCP-UT99(IRC、Unreal Tournament 99)
目录 扫描 WEB IRC 提权 扫描 sudo nmap 192.168.142.44 -p- -sS -sV PORT STATE SERVICE VERSION 21/tcp open ftp FileZilla ftpd 80/tcp open http Apache httpd 2.4.16 (OpenSSL/1.0.1p PHP/5.6.12) 44…...
Kubernetes CPU内存资源限定
在 Kubernetes 中创建工作负载时,您可以为 Pod 中的每一个容器指定其所需要的内存(RAM)大小和 CPU 数量。如果这些信息被指定了,Kubernetes 调度器可以更好的决定将 Pod 调度到哪一个节点。对于容器来说,其所需要的资源…...
fitlog使用教程(持续更新ing...)
诸神缄默不语-个人CSDN博文目录 fitlog包是用于自动版本管理和自动日志记录的Python包,是fastNLP团队开发的。 fitlog 中文文档 — fitlog 文档 我下载的是fitlog 0.9.15版本。 他们团队的文档写的真的不行,崩溃,FastNLP也很难用࿰…...
Linux下搭建Go开发环境
Linux下搭建Go开发环境可以按照以下步骤进行: 1、下载最新的Go语言二进制包,可以从官网 https://golang.org/dl/ 下载。 2、将下载好的包解压缩到你想要安装的目录下,如 /usr/local/go。 3、添加环境变量,在终端中输入以下命令…...
一文搞懂SQL注入攻击
SQL注入攻击 1. 前言2. SQL注入简介3. SQL注入步骤4. 防范SQL注入 1. 前言 随着互联网的发展和普及,网络安全问题越来越突出,网络在为用户提供越来越多服务的同时,也要面对各类越来越复杂的恶意攻击。SQL注入(SQL Injection&…...
CCTV-TIME特别关注:首届医药港国际健康美食文化嘉年华
“食在广州 味在方舟”首届医药港国际健康美食文化嘉年华4月28日在健康方舟盛大开幕! 【央媒时代TOP中国时代周刊中国品牌万里行CCTV-TIME特别关注】健康美食、滋补靓汤、异国风情、非遗文化、治愈萌宠、灯光夜市、亲子玩乐、浪漫许愿树……五一长假,广州的这场精彩嘉年华活动…...
FE_TA不知道的CSS 换行系列【1】white-space
在W3C官方描述中,white-space主要有以下两个作用: 是否进行空格合并,以及控制空格合并的方式;是否在soft wrap opportunities(文本中可进行换行的断点位置)处进行文本换行。 从字面意思来看white-space即…...
matlab中计算标准差std函数
标准差 标准差(Standard Deviation)是离均差平方的算术平均数(即:方差)的算术平方根。 标准差是方差的算术平方根。标准差能反映一个数据集的离散程度。平均数相同的两组数据,标准差未必相同。 计算公式&…...
【操作系统】原语操作详解
基本概念 "原语"一词源于英文 “primitive” 或 “instruction”,意为 “原始的” 或 “基本的指令”。在计算机科学中,原语是一种基本的操作,它是不可分割的,要么全部执行成功,要么全部执行失败࿰…...
mongDB的相关查询插入操作
db.getCollection(“ProductBuriedPointPo”).find();–查询 db.getCollection(“ProductBuriedPointPo”).remove({“_id”: ObjectId(“61e8f4c3bdc4381042acd296”)})–删除 db.getCollection(“ProductBuriedPointPo”).insert( { _id: ObjectId(“61e8f4c3bdc4381042acd2…...
【C++初阶】C++入门(二):引用内联函数auto关键字范围for循环(C++11)指针空值nullptr
📝个人主页:Sherry的成长之路 🏠学习社区:Sherry的成长之路(个人社区) 📖专栏链接:C初阶 🎯长路漫漫浩浩,万事皆有期待 上一篇博客:【C初阶】…...
地下污水厂智能照明控制应用
摘要:结合某地下污水厂项目,从结构、系统组成、系统功能、控制要求、场景模式等方面介绍了地下污水厂智能照明控制系统,探索了一套适用于地下污水厂的智能照明控制策略,以确保地下污水厂正常运行的照明需求。 关键词:智能照明控制系统;地下污…...
IS220UCSAH1A利用电子和空穴两种载流子导电的,所以叫做双极型电路
IS220UCSAH1A利用电子和空穴两种载流子导电的,所以叫做双极型电路 美国的通用电气公司(General Electric Company,以下简称 GE)想要称霸整个工业互联网,但却失败了。为什么呢? 多年来,GE 一直在…...
干货|英国专利申请
英国是世界上公认的一个实施现代专利制度的国家。英国1624年颁布的《垄断法案》被认为是世界上一部具有现代意义的专利法,并成为现代专利保护制度系的起点。英国现行的专利法于1977年颁布,并于1978年生效。英国的专利制度在保护发明创造,促进…...
springboot文件上传
1.新建文件上传页面 在static目录中新建upload-test.html,上传页面代码如下所示: <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>springboot文件上传测试</title> <…...
天龙八部手游服务端架设搭建教程
天龙八部手游服务端架设搭建教程 大家好,我是艾西。最近更新游戏搭建教程比较少也被不少小伙伴催更,今天我和大家聊聊天龙八部手游服务端架设搭建。 游戏讲述元佑元年,大宋遭受辽国入侵的故事,玩家可扮演峨眉、丐帮、天山、逍遥、…...
Windows 服务监控工具
在任何企业中,Windows 服务都是面向业务的应用程序的核心组件。这些 Windows 服务的有效运行对于防止网络和应用程序停机至关重要。这使得 Windows 服务监视成为任何网络管理策略的关键部分。 Windows 服务监视使管理员能够确保关键 Windows 服务的可用性ÿ…...
零基础抽象轻松MYSQL
不断学习,不断进步,才能不被替代 只有不被替代才是价值所在 ————2023年4月20日 目录 数据类型 数值型 数据类型 第一类:数值型 第二类:字符型 第三类:JSON第四类:时间日期型 数据类型中共分成了四大类…...
区块链赛项样题解析
文章目录 前言一、区块链产品方案设计及系统运维(预计2小时)1. 业务架构(Visio),需求分析、设计(doc)2. 区块链系统部署、测试搭建:(根据题目要求选择)测试:(根据题目要求选择&#…...
遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...
定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...
(转)什么是DockerCompose?它有什么作用?
一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...
【生成模型】视频生成论文调研
工作清单 上游应用方向:控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...
MySQL:分区的基本使用
目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区(Partitioning)是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分(分区)可以独立存储、管理和优化,…...
工厂方法模式和抽象工厂方法模式的battle
1.案例直接上手 在这个案例里面,我们会实现这个普通的工厂方法,并且对比这个普通工厂方法和我们直接创建对象的差别在哪里,为什么需要一个工厂: 下面的这个是我们的这个案例里面涉及到的接口和对应的实现类: 两个发…...
【AI News | 20250609】每日AI进展
AI Repos 1、OpenHands-Versa OpenHands-Versa 是一个通用型 AI 智能体,通过结合代码编辑与执行、网络搜索、多模态网络浏览和文件访问等通用工具,在软件工程、网络导航和工作流自动化等多个领域展现出卓越性能。它在 SWE-Bench Multimodal、GAIA 和 Th…...
