无法理解寄存器和变量之间的汇编mov指令

2024-06-19

我在 64 位 Linux 上使用 NASM 汇编器。 有一些关于变量和寄存器的东西我无法理解。 我创建一个名为“msg”的变量:

 msg db "hello, world"  

现在,当我想写入标准输出时,我移动msg to rsi注册,但我不明白mov按位指令... rsi 寄存器由 64 位组成,而 msg 变量有 12 个符号,每个符号 8 位,这意味着 msg 变量的大小为12 * 8bits ,显然大于 64 位。

那么如何才能做出这样的指令:
mov rsi, msg,不会溢出分配给 rsi 的内存。

或者 rsi 寄存器是否包含字符串第一个符号的内存位置,并且在写入 1 个符号后,它会更改为下一个符号的内存位置?

抱歉,如果我写的完全是废话,我是汇编新手,我只是暂时无法掌握它。


在 NASM 语法中(与 MASM 语法不同)mov rsi, symboladdress将符号转换为 RSI。 (使用 64 位绝对立即数效率低下;使用 RIP 相对 LEA 或mov esi, symbol反而。如何在 GNU 汇编器中将函数或标签的地址加载到寄存器中 https://stackoverflow.com/questions/57212012/how-to-load-address-of-function-or-label-into-register-in-gnu-assembler/57212627#57212627)

mov rsi, [symbol]将加载 8 个字节,起始位置为symbol。当您编写这样的指令时,您可以选择一个有用的位置来加载 8 个字节。

mov   rsi,  msg           ; rsi  = address of msg.  Use lea rsi, [rel msg] instead
movzx eax, byte [rsi+1]   ; rax  = 'e' (upper 7 bytes zeroed)
mov   edx, [msg+6]        ; rdx  = ' wor' (upper 4 bytes zeroed)

请注意,您可以使用mov esi, msg因为符号地址始终适合 32 位(在默认的“小”代码模型中,所有静态代码/数据都位于虚拟地址空间的低 2GB 中)。 NASM 通过汇编时间常量(例如mov rax, 1),但可能不能使用链接时间常量。为什么 32 位寄存器上的 x86-64 指令会将整个 64 位寄存器的上部清零? https://stackoverflow.com/questions/11177137/why-do-most-x64-instructions-zero-the-upper-part-of-a-32-bit-register

写入 1 个符号后,它会更改为下一个符号的存储位置吗?

不,如果你想要的话,你必须这样做inc rsi。没有魔法。指针只是您可以像任何其他整数一样操作的整数,而字符串只是内存中的字节。

访问寄存器并不会神奇地修改它们。

有类似的说明lodsb and pop从内存加载并增加一个指针(rsi or rsp分别),但 x86 没有任何前/后递增/递减寻址模式,因此您无法使用mov即使你想要它。使用add/sub or inc/dec.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法理解寄存器和变量之间的汇编mov指令 的相关文章

  • 如何在ubuntu下使用nasm(汇编)从键盘读取单个字符输入?

    我在ubuntu下使用nasm 顺便说一句 我需要从用户的键盘获取单个输入字符 就像当程序询问您 y n 时 因此当按下按键并且不按 Enter 键时 我需要读取输入的字符 我用谷歌搜索了很多 但我发现的所有内容都与这条线有关 int 21
  • 如何在 JavaScript 中检查字符串是否包含子字符串数组中的文本?

    非常简单 在 javascript 中 我需要检查字符串是否包含数组中保存的任何子字符串 没有任何内置功能可以为您执行此操作 您必须为其编写一个函数 尽管它可能只是对some数组方法 两种方法适合您 Array some method 正则
  • 如何打印垂直对齐的文本

    我想在文件中打印以下格式的输出 1 Introduction 1 1 1 Scope 1 1 2 Relevance 1 1 2 1 Advantages 1 1 2 1 1 Economic 2 1 2 2 Disadvantages
  • 在C中查找子字符串在字符串中的位置

    这是一个接受的程序 来自用户的一句话 来自用户的话 如何找到输入的单词在句子中的位置 include
  • Json 将字符串中的 & 转换为 \u0026

    我正在尝试从 pdf 中提取文本并将其写入 json 文件 在提取 unicode 字符时 Json 将所有 转换为 u0026 例如我的实际字符串是 1588 代表 它正确打印到 txt 文件 控制台等 但是当我尝试将此字符串打印到 Js
  • Python fuzzywuzzy 错误字符串或缓冲区期望

    我正在使用 fuzzywuzzy 在公司名称 csv 中查找近似匹配项 我正在将手动匹配的字符串与不匹配的字符串进行比较 希望找到一些有用的邻近匹配 但是 我在 fuzzywuzzy 中遇到了字符串或缓冲区错误 我的代码是 from fuz
  • 在样式定义中使用@string资源

    我在 styles xml 文件中定义了类似以下内容 如下所示 但是Android由于使用 string fontExtraLarge而崩溃 我假设这是因为定义的顺序 但这合法吗 我可以使用样式 parent 属性来解决此问题 但对于只有一
  • 如何替换 JavaScript 中出现的所有字符串?

    给定一个字符串 s Test abc test test abc test test test abc test test abc 这似乎只删除了第一次出现的abc在上面的字符串中 s s replace abc 我该如何更换all它的出现
  • 如何在 MacOS 上的 MARS 中打开保存的 .asm 文件

    我是 MIPS 的新手 我找不到如何打开我保存的文件 我在下载文件夹下保存了 asm 文件 但是当我尝试在 MARS 中打开文件并导航到同一下载文件夹时 asm 文件不会出现 我在 MacOS 上使用 MARS 如上所述 您需要在 macO
  • C++字符串解析思路

    我有另一个程序的输出 它更适合人类可读而不是机器可读 但无论如何我都会解析它 没什么太复杂的 然而 我想知道在 C 中执行此操作的最佳方法是什么 这更像是一个 一般实践 类型的问题 我研究了 Boost Spirit 甚至让它发挥了一些作用
  • 如何配置和采样英特尔进程内性能计数器

    简而言之 我试图在用户级基准测试进程中实现以下目标 伪代码 假设 x86 64 和 UNIX 系统 results for iteration 0 iteration lt num iterations iteration pctr sta
  • 错误“无法将参数 '1' 的 'std::basic_string' 转换为 'const char*' 到 'int system(const char*)'”

    当我尝试编译脚本时 出现此错误 类型 const char 和 const char 6 到二进制 operator 的操作数无效 这里应该是错误 string name john system quickscan exe resoluti
  • Python 字符串格式 - 类型错误 - 格式字符串参数不足

    那么这个字符串有什么问题呢 我无法弄清楚为什么它说格式字符串没有足够的参数 我是 Python 新手 只是想弄清楚 编辑 这与建议的其他问题不同 另一个正在尝试做一些我什至没有涉及的疯狂数组事情 我只需要了解元组的基本概念以及字符串格式化的
  • 如何在二维数组中找到字符串?

    我有一个看起来像这样的数组 var array a b c d e f 我希望能够在数组中搜索字符串 d 并返回对应的值 c try function find str array for var i in array if array i
  • 没有 DateAdd() 的 SSIS 表达式前一个日期

    目前正在开发一个包 它将表达式从先前的日期传递到文件名 我当前的代码如下作为字符串变量 DT WSTR 20 DATEPART YYYY Dateadd DD 1 dateadd MM datediff MM DT DATE 1900 01
  • 使用 32 位块对 1024 位 2 的补码进行有符号乘法

    因此 我对 1024 位数字有以下结构定义 我想在此处使用 2 的补码表示 并且我使用的是 32 位系统 typedef struct int1024 int32 t num 32 should I use uint32 t int1024
  • 将字符串列表转换为字典

    我有一个清单 Tests run 1 Failures 0 Errors 0 我想将其转换为字典 Tests run 1 Failures 0 Errors 0 我该怎么做 Use a Tests run 1 Failures 0 Erro
  • emu8086中如何使用字符串

    我需要 emu8086 中字符串的帮助 我已经初始化了一个字符串 str1 db 0neWord 我有一个空字符串 str2 db 现在我需要检查所有信件str1并复制到str2 但如果字母在str1是 0 我需要将其替换为 O 如果不是
  • Powershell - 将字符串拆分为由开始和结束字符串划分的数组

    我有一个多行字符串 来自 json 例如 somekey somevalue somekey somevalue somekey somevalue somekey somenumber somekey null 我想将字符串拆分为一个数组
  • 编译时“strlen()”有效吗?

    有时需要将字符串的长度与常量进行比较 例如 if line length gt 2 Do something 但我试图避免在代码中使用 魔法 常量 通常我使用这样的代码 if line length gt strlen Do somethi

随机推荐

  • JavaFX Platform.runLater 的使用以及从不同线程访问 UI

    我有几个问题Platform runLater 我有一个 JavaFX 应用程序类 在这个类中 我运行一个线程 该线程从网络套接字读取数据 现在当我创建一个新的Stage在线程内部 系统抛出异常 JavaFX 事件调度程序线程和我的网络读取
  • 如何在Java 8中实现Elvis运算符?

    我有一个经典的 Elvis 运算符 案例 其中我调用每个可能返回 null 的方法并将它们链接在一起 thing nullableMethod1 a nullableMethod2 b nullableMethod3 在 Java 8 中
  • Django查询集基于外键值的特定顺序

    对于棒球网站 我有两个模型 位置模型和球员模型 位置被命名为投手 捕手 一垒 二垒 三垒等 class Position models Model name models CharField max length 100 slug mode
  • React-chartjs-2 圆环图导出为 png

    我使用react chartjs 2库创建了一个甜甜圈图和条形图 现在我想将此图表导出为 png 即在用户单击时将图表下载为 png 我尝试了很多方法但未能成功 其中之一是使用 html2canvas 库并获取屏幕截图 但这会降低图表的质量
  • mongodb从不同数据库中选择

    我有大约 200 个 mongodb 数据库 每个数据库都有一个名为 Group 的集合 在该集合中有一个名为 meldingId 的字段 是否可以进行一个 mongodb 查询来查找不同数据库中的所有值 我设法通过 selectDB da
  • 如何从 Cursor 获取行 ID

    如何从游标获取行 ID 我不认为 Cursor 直接暴露了这一点 SQLiteDatabase insert 返回新插入行的行 ID 或者在 Android 中 惯例是有一个名为 id 包含表的主自动增量键 所以cursor getLong
  • rxjs 主题应该在课堂上公开吗?

    假设我有两个类 您可以在其中观察一些可观察量 第一个例子 公共主题 class EventsPub public readonly onEnd new Subject
  • Pandas:将增量数字添加到一列的重复值的后缀,这些重复值按另一列的值分组并按索引排序

    我试图将下划线和增量数字添加到按索引排序的任何重复值以及由另一列定义的组内 例如 我希望 化学 列中的重复值具有下划线和增量数字 并按索引排序并按 循环 列分组 df pd DataFrame 1 1 1 1 1 1 2 2 2 2 2 2
  • 内核的panic()函数是否完全冻结所有其他进程?

    我想确认内核的panic 功能和其他类似kernel halt and machine halt 一旦触发 保证机器完全冻结 那么 所有的内核和用户进程都被冻结了吗 是panic 可以被调度程序中断吗 中断处理程序仍然可以执行吗 用例 如果
  • Facebook edge.create 事件未在类似框上触发

    我有一个带有简单 Facebook 类似按钮的页面 我需要知道用户何时喜欢该页面 因此我使用 edge create 事件来执行此操作 一切正常 我现在需要向页面添加一个 Like Box 插件来给客户的 Facebook 页面点赞 并且当
  • 闪存应用程序的国际化

    我正在使用 Flash 应用程序 非 Flex 并且我想支持国际化 在flex中有一个很好的抽象ResourceManager 您可以在其中为每个语言环境提供资源包 动作脚本有等效的吗 怎么样全球化 http www servebox or
  • 设置 SWT Shell 的默认字体

    有没有办法为整个 Shell 设置默认字体 以便任何新控件都将使用相同的字体 看来现在我必须为我创建的每个控件设置字体 这导致了太多的冗余 默认使用的字体由平台选择 请参阅中的其他信息 类字体 SWT 标准小部件工具包 http book
  • 使用 C++ 访问 Azure blob 存储 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 使用 AbstractTableModel 获取 JTable 中选定的行

    我有一个JTable using AbstractTableModel我在哪里有一个JCheckBox在第一列中用于选择行 现在 我需要从已检查的表中获取选定的行 现在 我按顺序从第一行遍历到最后一行并获取所有选择的行 如下所示 List
  • 我应该在 Promise.all 中使用 wait 吗?

    我正在构建快速中间件 以对数据库进行两次异步调用 以检查用户名或电子邮件是否已在使用中 这些函数返回的承诺没有捕获 因为我想将数据库逻辑与 req res next 逻辑分开 并且我有集中的错误处理 需要next作为一个论点 在我对本地环境
  • 我想自动生成这种格式的账单编号 (INV1/23) 并且它必须以 1 递增

    我想以这种格式 INV1 23 自动生成帐单号码 而不使用oracle apex中的序列 请在plsql中编写查询 我在此过程中使用了序列 但它对此不起作用 它必须以表格形式显示在交互式报告上 就像当我输入有关账单的数据 例如订单号 订单日
  • 将 std::make_unique 与自定义删除器一起使用

    在使用std unique ptr带有我想要使用的自定义删除器std make unique而不是全新的 我用的是VC 2013 在我看来 没有办法使用std unique ptr如果您使用自定义删除器 我错过了什么还是事实确实如此 附加信
  • Angularjs 范围之外的服务功能

    我在 angularJS 中创建了一个服务 它使用 btford socket io 模块与服务器交互 由于在服务中我已经实现了一些目前在 Angular 内部使用的 API 但为了以后扩展应用程序 我还需要在 Angular 范围之外提供
  • 在 woocommerce 管理订单页面中单击自定义按钮运行函数

    基于 在 woocommerce 中的管理订单列表顶部添加一个按钮 https stackoverflow com questions 49437781 add a button on top of admin orders list in
  • 无法理解寄存器和变量之间的汇编mov指令

    我在 64 位 Linux 上使用 NASM 汇编器 有一些关于变量和寄存器的东西我无法理解 我创建一个名为 msg 的变量 msg db hello world 现在 当我想写入标准输出时 我移动msg to rsi注册 但我不明白mov