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

汇编与内联 x86-64

机器字长

x86是32位系统
64是64位系统

这里的32和64,指的都是机器字长

机器字长是

  1. 能直接进行整数/位运算的大小
  2. 指针的大小(索引内存的范围)

容易与机器字长混淆的概念:字

字=存储字长
字是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&#xff0c;指的都是机器字长 机器字长是 能直接进行整数/位运算的大小指针的大小(索引内存的范围) 容易与机器字长混淆的概念&#xff1a;字 字 字存储字长 字是MDR寄存器的位数&#xff0c;代表每个主存存储体中的存储…...

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 中创建工作负载时&#xff0c;您可以为 Pod 中的每一个容器指定其所需要的内存&#xff08;RAM&#xff09;大小和 CPU 数量。如果这些信息被指定了&#xff0c;Kubernetes 调度器可以更好的决定将 Pod 调度到哪一个节点。对于容器来说&#xff0c;其所需要的资源…...

fitlog使用教程(持续更新ing...)

诸神缄默不语-个人CSDN博文目录 fitlog包是用于自动版本管理和自动日志记录的Python包&#xff0c;是fastNLP团队开发的。 fitlog 中文文档 — fitlog 文档 我下载的是fitlog 0.9.15版本。 他们团队的文档写的真的不行&#xff0c;崩溃&#xff0c;FastNLP也很难用&#xff0…...

Linux下搭建Go开发环境

Linux下搭建Go开发环境可以按照以下步骤进行&#xff1a; 1、下载最新的Go语言二进制包&#xff0c;可以从官网 https://golang.org/dl/ 下载。 2、将下载好的包解压缩到你想要安装的目录下&#xff0c;如 /usr/local/go。 3、添加环境变量&#xff0c;在终端中输入以下命令…...

一文搞懂SQL注入攻击

SQL注入攻击 1. 前言2. SQL注入简介3. SQL注入步骤4. 防范SQL注入 1. 前言 随着互联网的发展和普及&#xff0c;网络安全问题越来越突出&#xff0c;网络在为用户提供越来越多服务的同时&#xff0c;也要面对各类越来越复杂的恶意攻击。SQL注入&#xff08;SQL Injection&…...

CCTV-TIME特别关注:首届医药港国际健康美食文化嘉年华

“食在广州 味在方舟”首届医药港国际健康美食文化嘉年华4月28日在健康方舟盛大开幕! 【央媒时代TOP中国时代周刊中国品牌万里行CCTV-TIME特别关注】健康美食、滋补靓汤、异国风情、非遗文化、治愈萌宠、灯光夜市、亲子玩乐、浪漫许愿树……五一长假,广州的这场精彩嘉年华活动…...

FE_TA不知道的CSS 换行系列【1】white-space

在W3C官方描述中&#xff0c;white-space主要有以下两个作用&#xff1a; 是否进行空格合并&#xff0c;以及控制空格合并的方式&#xff1b;是否在soft wrap opportunities&#xff08;文本中可进行换行的断点位置&#xff09;处进行文本换行。 从字面意思来看white-space即…...

matlab中计算标准差std函数

标准差 标准差&#xff08;Standard Deviation&#xff09;是离均差平方的算术平均数&#xff08;即&#xff1a;方差&#xff09;的算术平方根。 标准差是方差的算术平方根。标准差能反映一个数据集的离散程度。平均数相同的两组数据&#xff0c;标准差未必相同。 计算公式&…...

【操作系统】原语操作详解

基本概念 "原语"一词源于英文 “primitive” 或 “instruction”&#xff0c;意为 “原始的” 或 “基本的指令”。在计算机科学中&#xff0c;原语是一种基本的操作&#xff0c;它是不可分割的&#xff0c;要么全部执行成功&#xff0c;要么全部执行失败&#xff0…...

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

​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;C初阶 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 上一篇博客&#xff1a;【C初阶】…...

地下污水厂智能照明控制应用

摘要:结合某地下污水厂项目&#xff0c;从结构、系统组成、系统功能、控制要求、场景模式等方面介绍了地下污水厂智能照明控制系统&#xff0c;探索了一套适用于地下污水厂的智能照明控制策略&#xff0c;以确保地下污水厂正常运行的照明需求。 关键词:智能照明控制系统;地下污…...

IS220UCSAH1A利用电子和空穴两种载流子导电的,所以叫做双极型电路

IS220UCSAH1A利用电子和空穴两种载流子导电的&#xff0c;所以叫做双极型电路 美国的通用电气公司&#xff08;General Electric Company&#xff0c;以下简称 GE&#xff09;想要称霸整个工业互联网&#xff0c;但却失败了。为什么呢&#xff1f; 多年来&#xff0c;GE 一直在…...

干货|英国专利申请

英国是世界上公认的一个实施现代专利制度的国家。英国1624年颁布的《垄断法案》被认为是世界上一部具有现代意义的专利法&#xff0c;并成为现代专利保护制度系的起点。英国现行的专利法于1977年颁布&#xff0c;并于1978年生效。英国的专利制度在保护发明创造&#xff0c;促进…...

springboot文件上传

1.新建文件上传页面 在static目录中新建upload-test.html&#xff0c;上传页面代码如下所示&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>springboot文件上传测试</title> <…...

天龙八部手游服务端架设搭建教程

天龙八部手游服务端架设搭建教程 大家好&#xff0c;我是艾西。最近更新游戏搭建教程比较少也被不少小伙伴催更&#xff0c;今天我和大家聊聊天龙八部手游服务端架设搭建。 游戏讲述元佑元年&#xff0c;大宋遭受辽国入侵的故事&#xff0c;玩家可扮演峨眉、丐帮、天山、逍遥、…...

Windows 服务监控工具

在任何企业中&#xff0c;Windows 服务都是面向业务的应用程序的核心组件。这些 Windows 服务的有效运行对于防止网络和应用程序停机至关重要。这使得 Windows 服务监视成为任何网络管理策略的关键部分。 Windows 服务监视使管理员能够确保关键 Windows 服务的可用性&#xff…...

零基础抽象轻松MYSQL

不断学习&#xff0c;不断进步&#xff0c;才能不被替代 只有不被替代才是价值所在 ————2023年4月20日 目录 数据类型 数值型 数据类型 第一类&#xff1a;数值型 第二类&#xff1a;字符型 第三类&#xff1a;JSON第四类&#xff1a;时间日期型 数据类型中共分成了四大类…...

区块链赛项样题解析

文章目录 前言一、区块链产品方案设计及系统运维&#xff08;预计2小时&#xff09;1. 业务架构(Visio)&#xff0c;需求分析、设计(doc)2. 区块链系统部署、测试搭建&#xff1a;&#xff08;根据题目要求选择&#xff09;测试&#xff1a;&#xff08;根据题目要求选择&#…...

手游刚开服就被攻击怎么办?如何防御DDoS?

开服初期是手游最脆弱的阶段&#xff0c;极易成为DDoS攻击的目标。一旦遭遇攻击&#xff0c;可能导致服务器瘫痪、玩家流失&#xff0c;甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案&#xff0c;帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)

一、数据处理与分析实战 &#xff08;一&#xff09;实时滤波与参数调整 基础滤波操作 60Hz 工频滤波&#xff1a;勾选界面右侧 “60Hz” 复选框&#xff0c;可有效抑制电网干扰&#xff08;适用于北美地区&#xff0c;欧洲用户可调整为 50Hz&#xff09;。 平滑处理&…...

centos 7 部署awstats 网站访问检测

一、基础环境准备&#xff08;两种安装方式都要做&#xff09; bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats&#xff0…...

基于服务器使用 apt 安装、配置 Nginx

&#x1f9fe; 一、查看可安装的 Nginx 版本 首先&#xff0c;你可以运行以下命令查看可用版本&#xff1a; apt-cache madison nginx-core输出示例&#xff1a; nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

Linux简单的操作

ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

VTK如何让部分单位不可见

最近遇到一个需求&#xff0c;需要让一个vtkDataSet中的部分单元不可见&#xff0c;查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行&#xff0c;是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示&#xff0c;主要是最后一个参数&#xff0c;透明度…...

CMake 从 GitHub 下载第三方库并使用

有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)

上一章用到了V2 的概念&#xff0c;其实 Fiori当中还有 V4&#xff0c;咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务)&#xff0c;代理中间件&#xff08;ui5-middleware-simpleproxy&#xff09;-CSDN博客…...

JAVA后端开发——多租户

数据隔离是多租户系统中的核心概念&#xff0c;确保一个租户&#xff08;在这个系统中可能是一个公司或一个独立的客户&#xff09;的数据对其他租户是不可见的。在 RuoYi 框架&#xff08;您当前项目所使用的基础框架&#xff09;中&#xff0c;这通常是通过在数据表中增加一个…...