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

x86-64数据传送指令精解

仅用于个人复习计算机基础一、核心概览这份文档的核心是讲解如何在不同位置寄存器、内存之间移动数据以及移动时如何处理数据的大小和符号问题。关键在于理解“数据大小”和“符号扩展/零扩展”这两个概念。二、通用数据传送指令详解1. MOV 指令族基本传送功能将数据从源操作数S复制到目的操作数D。关键规则大小必须匹配指令后缀b-字节,w-字/2字节,l-双字/4字节,q-四字/8字节必须与操作数尤其是寄存器部分的大小匹配。例如%eax是32位寄存器必须用movl。两个操作数不能同时是内存地址数据不能直接从内存的一个位置复制到另一个位置必须通过寄存器中转。movl的特殊行为当目的操作数是寄存器时movl不仅会写入低32位还会自动将该寄存器的高32位清零。这是x86-64架构的规定确保32位操作的结果在64位环境中是干净的。示例分析movabsq $0x0011223344556677, %rax # 初始化 rax 0x0011223344556677 movb $0xFF, %al # 只改变 al (最低1字节)。rax 0x00112233445566FF movw $0xFFFF, %ax # 只改变 ax (低2字节)。rax 0x001122334455FFFF movl $0xFFFFFFFF, %eax # 改变 eax (低4字节)并清零高32位。rax 0x00000000FFFFFFFF movq $0xFFFFFFFF, %rax # 改变整个rax (8字节)。注意立即数0xFFFFFFFF会被符号扩展为0xFFFFFFFFFFFFFFFFmovabsq这是movq的一个特例用于传送任意的64位立即数到寄存器。普通的movq指令只能传送可以表示为32位补码的立即数然后符号扩展为64位。2. MOVZ 指令族零扩展传送功能将较小的源操作数复制到较大的目的寄存器并用0填充目的寄存器中剩余的高位。适用场景处理无符号数的类型提升例如C语言中将unsigned char赋值给unsigned int。命名规则movzxy其中x是源大小y是目的大小。例如movzbw零扩展字节(b)到字(w)。movzwl零扩展字(w)到双字(l)。movzbq零扩展字节(b)到四字(q)。movzwq零扩展字(w)到四字(q)。注意没有movzlq32位零扩展到64位指令因为movl指令在以寄存器为目的时其“清零高32位”的行为已经等效于零扩展。3. MOVS 指令族符号扩展传送功能将较小的源操作数复制到较大的目的寄存器并用源操作数的符号位最高位的副本填充目的寄存器中剩余的高位。适用场景处理有符号数的类型提升例如C语言中将signed char赋值给int。命名规则movsxy规则同MOVZ。例如movsbq符号扩展字节(b)到四字(q)。movslq符号扩展双字(l)到四字(q)。特殊指令cltq这是一个无操作数的专用指令功能等同于movslq %eax, %rax。它将%eax32位中的有符号整数符号扩展到%rax64位中。对比示例movabsq $0x0011223344556677, %rax # rax 0x0011223344556677 movb $0xAA, %dl # dl 0xAA (二进制10101010最高位为1是负数) movb %dl, %al # 仅复制字节不改变高位。rax 0x00112233445566AA movsbq %dl, %rax # 符号扩展源字节最高位是1高位全补1。rax 0xFFFFFFFFFFFFFFAA movzbq %dl, %rax # 零扩展无论源值是什么高位全补0。rax 0x00000000000000AA三、指针操作在汇编中的体现文档通过一个exchange函数的例子展示了C语言指针操作如何对应到汇编指令。C代码long exchange(long *xp, long y) { long x *xp; // 指针解引用读内存 *xp y; // 指针解引用写内存 return x; }对应汇编代码exchange: movq (%rdi), %rax # 1. 从 xp (%rdi) 指向的内存地址读取8字节到 %rax (实现 x *xp) movq %rsi, (%rdi) # 2. 将 y (%rsi) 的值写入 xp (%rdi) 指向的内存地址 (实现 *xp y) ret # 3. 返回返回值已放在 %rax 中 (即 x)关键理解指针就是地址指针变量xp的值一个内存地址被存放在寄存器%rdi中。解引用就是内存访问C语言中的*xp操作在汇编中体现为使用括号的间接寻址(%rdi)。局部变量常驻寄存器为了提高效率像x这样的局部变量通常保存在寄存器这里是%rax中而不是内存中。四、栈操作指令PUSH/POP文档末尾提到了栈操作虽然未展开但这是数据传送的重要应用场景。栈程序运行时管理函数调用和局部变量的一块内存区域特点是“后进先出”(LIFO)。栈指针寄存器%rsp始终指向栈顶。pushq S将数据S压入栈。等效操作%rsp %rsp - 8; *(%rsp) S;先下移栈指针开辟空间再存入数据。popq D从栈顶弹出数据到D。等效操作D *(%rsp); %rsp %rsp 8;先取出数据再上移栈指针释放空间。五、文档中的练习与要点类型转换与指令选择文档中的表格练习要求根据源类型和目的类型选择正确的mov、movs或movz指令。核心原则是先处理大小变化再根据源类型的符号性有符号/无符号决定使用符号扩展(MOVS)还是零扩展(MOVZ)。movl的隐含零扩展这是x86-64的关键特性。当你在C语言中将一个32位int赋值给64位long时编译器生成的movl指令会自动保证高32位为0符合无符号扩展的语义如果源是无符号整数则结果正确如果是有符号整数则相当于先进行了符号扩展到32位再零扩展到64位需要注意符号位在32位以内已正确表示。总结这份文档系统地阐述了x86-64中数据移动的机制MOV用于等尺寸数据移动注意movl会清零高位。MOVZ用于无符号数的小转大高位补0。MOVS用于有符号数的小转大高位补符号位。指针操作在机器级就是地址加载和内存访问。栈操作是特殊的内存读写由%rsp管理。

相关文章:

x86-64数据传送指令精解

仅用于个人复习计算机基础,一、核心概览这份文档的核心是讲解如何在不同位置(寄存器、内存)之间移动数据,以及移动时如何处理数据的大小和符号问题。关键在于理解 “数据大小” 和 “符号扩展/零扩展” 这两个概念。二、通用数据传…...

在线数据库建模工具dbdiagram.io - 学习

在线数据库建模工具dbdiagram.io - 创建ER图 工具在线网址:https://dbdiagram.io/home 说明文档网址:https://dbml.dbdiagram.io/docs/ 创建ER图: 1、打开在线网址:https://dbdiagram.io/home,点下图红色的创建图表 。…...

用YOLOv3+ReID模型,手把手教你搭建一个简易的跨摄像头行人追踪系统(附完整代码)

基于YOLOv3与ReID模型的跨摄像头行人追踪系统实战指南 1. 系统架构与技术选型 跨摄像头行人追踪系统主要由两大核心模块构成:目标检测模块和行人重识别模块。YOLOv3作为当前最先进的目标检测算法之一,以其出色的实时性和准确性成为本系统的首选检测框架。…...

AzurLaneAutoScript:7x24小时不间断的碧蓝航线全自动管家

AzurLaneAutoScript:7x24小时不间断的碧蓝航线全自动管家 【免费下载链接】AzurLaneAutoScript Azur Lane bot (CN/EN/JP/TW) 碧蓝航线脚本 | 无缝委托科研,全自动大世界 项目地址: https://gitcode.com/gh_mirrors/az/AzurLaneAutoScript 碧蓝航…...

实战案例分享:如何用RexUniNLU零样本处理法律合同文本

实战案例分享:如何用RexUniNLU零样本处理法律合同文本 1. 引言 1.1 法律合同处理的现实困境 想象一下,你是一家公司的法务人员,每天需要审阅几十份合同。这些合同来自不同的供应商、客户和合作伙伴,格式各异,内容繁…...

EMQX MQTT 服务器部署与配置指南

1. 简介 EMQX 是一款大规模可弹性伸缩的云原生分布式物联网 MQTT 消息服务器。它支持千万级并发连接,是构建物联网(IoT)平台的首选 MQTT Broker 之一。本文档将详细指导如何在 Linux 云服务器上安装、配置并加固 EMQX 服务器。 2. 环境准备与前置条件 2.1 服务器…...

告别‘test-keys’:手把手教你修改AOSP 9.0的Build Fingerprint,绕过App环境检测

深度定制Android系统指纹:从原理到实战绕过环境检测 在Android生态中,系统指纹(Build Fingerprint)就像设备的身份证,不仅标识着系统版本信息,还隐含着编译类型等关键属性。许多金融类、游戏类应用会通过检…...

别再手动改配置了!用FRP v0.61.0的Web仪表盘,图形化搞定内网穿透

FRP v0.61.0 Web仪表盘:可视化内网穿透管理新体验 每次修改配置文件都要重启服务?还在用命令行查看连接状态?FRP v0.61.0的Web仪表盘功能将彻底改变你的内网穿透管理方式。这个被许多用户忽略的"隐藏功能",实际上能大幅…...

别再折腾龙虾AI!手机控电脑自动工作源码搭建教程

温馨提示:文末有资源获取方式最近“龙虾AI”火得一塌糊涂,到处都在说养龙虾。但真实情况是,技术门槛高得离谱,普通用户根本玩不转。别急着折腾了。今天分享一个更实在的思路:用手机说话,就能让电脑全自动干…...

零知派——ESP32-S3 AI 小智 使用 Preferences NVS 实现Web配网持久化

✔零知派(零知开源)是一个专为电子初学者/电子兴趣爱好者设计的开源软硬件平台,在硬件上提供超高性价比STM32系列开发板、物联网控制板。取消了Bootloader程序烧录,让开发重心从 “配置环境” 转移到 “创意实现”,极大…...

VSCode低代码插件性能临界点测试:当表单字段超127个时,这4个插件率先崩溃(附压测脚本)

https://intelliparadigm.com 第一章:VSCode低代码插件性能临界点测试:当表单字段超127个时,这4个插件率先崩溃(附压测脚本) 低代码开发正深度融入 VSCode 生态,但多数插件在高复杂度表单场景下缺乏压力验…...

基于Falcon-7B构建私人对话机器人的实践指南

1. 从零搭建私人对话机器人的技术解析作为一名长期从事自然语言处理开发的工程师,我经常被问到如何在家用设备上部署类似ChatGPT的对话系统。虽然完整复现ChatGPT需要专业级算力,但通过开源模型和巧妙设计,我们完全可以构建一个功能完备的私人…...

揭秘C++ MCP网关核心设计:从epoll+无锁队列到内存池预分配,3大吞吐翻倍关键技术全公开

第一章:C MCP网关架构全景与性能目标定义C MCP(Microservice Control Plane)网关是面向高吞吐、低延迟微服务通信场景设计的核心基础设施组件,其核心职责涵盖协议转换、路由决策、熔断限流、可观测性注入及安全策略执行。该网关并…...

LuatOS扩展库API——【libfota2】远程升级

LuatOS 是面向物联网设备的轻量级嵌入式 Lua 脚本运行框架 / 实时系统,基于 Lua 5.3 深度优化,用于 4G‑Cat.1、MCU 等物联网终端。LuatOS 开发特点是基于 Lua 脚本、协程多任务设计,当前LuatOS共有70多个核心库,20多个扩展库&…...

Docker 27边缘容器编排实战:从零部署到万级IoT节点稳定运行的7个硬核配置诀窍

第一章:Docker 27边缘容器编排的演进逻辑与核心挑战边缘计算场景下,容器编排正从中心化调度向轻量、自治、低延迟协同范式迁移。Docker 27并非官方版本号(Docker CE 最新稳定版为 24.x),但作为技术演进的抽象符号&…...

ubuntu的基本使用

一.ubuntu的基本操作ctrlaltt:启动终端ctrlshift:终端字体变大ctrl-:终端字体变小ctrlshiftc/v:终端复制/粘贴文本cat/etc/issue:查看操作系统的版本tab键:自动补齐上下键:历史命令二.linux常用的shell命令1. linuxubuntu:~$:命令提示符解释&…...

C++编写MCP网关如何扛住50万TPS并发且零RCE漏洞?:基于ASan+Control-Flow Integrity+硬件辅助加密的工业级方案

第一章:C编写高吞吐量MCP网关安全性最佳方案总览构建高吞吐量MCP(Message Control Protocol)网关时,安全性不能以性能为代价妥协。现代金融、IoT与实时通信场景要求网关在百万级TPS下仍能抵御重放攻击、会话劫持、协议混淆及内存越…...

BiliDownload终极指南:一站式B站视频下载解决方案

BiliDownload终极指南:一站式B站视频下载解决方案 【免费下载链接】BiliDownload B站视频下载工具 项目地址: https://gitcode.com/gh_mirrors/bil/BiliDownload 你是否曾经遇到过这样的困扰?看到B站上精彩的教学视频、有趣的Vlog或者珍贵的纪录片…...

海明码和异或运算

一、海明码二、异或运算...

5分钟搞定视频字幕提取:免费本地工具终极指南

5分钟搞定视频字幕提取:免费本地工具终极指南 【免费下载链接】video-subtitle-extractor 视频硬字幕提取,生成srt文件。无需申请第三方API,本地实现文本识别。基于深度学习的视频字幕提取框架,包含字幕区域检测、字幕内容提取。A…...

[AI] [Linux] 教我编一个启用rust的riscv kernel用于qemu启动

本文是博主在博客写作中的一次全新尝试,本次尝试通过输入给Claude Sonnet 4.6的prompt来自动生成一篇技术性博客。Prompt为: linux 7.0 kernel在 /home/projects/linux/linux,教我编一个启用rust的riscv kernel用于qemu启动Output如下(未作任…...

PPT图片视频音频提取神器,PPT模板不求人,建议使用

聊一聊看别人做的PPT总是那么好看。到自己做的时候,总是搭配不好,怎么搭配都感觉不好看。今天,给大家介绍一款神器,可以直接提取他人PPT里面的视频、图片、音频信息。收集他人PPT里面的素材,方便自己使用。非常简单&am…...

MySQL 索引介绍

本文章讲解 Hash、二叉树、平衡二叉树、B-Tree、BTree 索引的逻辑情况 查找都是索引操作,当数据量较大时,索引的大小可能有几个 G,甚至更多,为了减少索引在内存的占用,数据库索引是存储在磁盘上的,将索引以…...

Qwen-Image-Edit-F2P镜像免配置价值:省去diffusers/transformers手动安装

Qwen-Image-Edit-F2P镜像免配置价值:省去diffusers/transformers手动安装 想玩转AI图像生成和编辑,但被复杂的模型部署、环境配置劝退?这大概是很多开发者和AI爱好者的共同烦恼。手动安装diffusers、transformers库,处理各种依赖…...

如何用AI打造原创OC角色?2026从角色设定到动态生成的全链路创作指南

在原创角色OC创作中,AI已成为核心动力,打破“想法难落地、技术门槛高”的困境。想打造有灵魂、还原度高的角色,关键在于顺畅完成“概念设定→视觉落地→动态赋能→精细打磨”。V2Fun.art凭借全流程整合、低门槛操作和高适配性,成为…...

nli-MiniLM2-L6-H768快速上手:金融研报摘要主题分类(科技/宏观/行业)

nli-MiniLM2-L6-H768快速上手:金融研报摘要主题分类(科技/宏观/行业) 1. 工具简介 nli-MiniLM2-L6-H768是一款基于cross-encoder/nli-MiniLM2-L6-H768轻量级NLI模型开发的本地零样本文本分类工具。它专为解决传统文本分类需要大量标注数据和…...

颠覆传统巡检模式:AI技术如何重塑安全生产新格局

作为"我ai去巡检"小程序的技术研发团队,我们亲眼见证了人工智能如何从实验室概念转变为守护安全生产的核心力量。今天,我们将深入剖析AI技术在安全生产领域的前沿应用,揭秘我们如何攻克技术难题,打造这款重新定义行业标…...

Spring Security配置了AccessDeniedHandler却无效?别急,先检查你的全局异常处理器

Spring Security异常处理冲突排查指南:当AccessDeniedHandler遇上全局异常处理器 最近在重构一个老项目的权限模块时,遇到了一个看似简单却让人抓狂的问题:明明按照文档配置了AccessDeniedHandler,但权限不足时依然直接抛出Access…...

踩坑实录:NFS挂载环境下脚本执行权限问题(Operation not permitted)的深度排查与解决

在企业级部署中,NFS(网络文件系统)常被用来共享存储资源,方便多节点统一访问数据与安装包。但这种“便捷共享”的环境,也常常隐藏着各种权限陷阱。最近在KingbaseES数据库安装部署中,我就踩了一个典型的NFS…...

微软office365怎么安装?(保姆级流程)

1、微软office官网(www.office.com)--登录(报名后老师给的账号)2、登录后的界面3、应用--安装应用程序--Microsoft 365应用版4、下载office软件安装程序到桌面(或者你能找到的地方)5、找到安装程序并双击安…...