.asciz 和 .string 汇编器指令之间有什么区别?

2023-12-23

我知道.ascii指令不会在字符串末尾放置空字符,因为.asciz指令就是用于此目的。不过,我不知道是否.string指令在字符串末尾放置一个空字符。

如果它确实附加了空字符,那么两者之间有什么区别.asciz.string指令?对我来说,两者兼而有之.asciz and .string似乎多余。


根据GNU Binutils 文档as https://sourceware.org/binutils/docs/as/index.html#SEC_Contents:

.ascii "string" https://sourceware.org/binutils/docs/as/Ascii.html#Ascii(此处是为了完整性)

.ascii需要零个或多个以逗号分隔的字符串文字 [...]。它将每个字符串(没有自动尾随零字节)组装成连续的地址。

.asciz "string" https://sourceware.org/binutils/docs/as/Asciz.html#Asciz

.asciz就像.ascii,但每个字符串后跟一个零字节。这 ”z" in '.asciz' 代表“零”。

.string "str", .string8 "str", .string16 "str", .string32 "str", .string64 "str" https://sourceware.org/binutils/docs/as/String.html#String

复制其中的字符str到目标文件。您可以指定多个要复制的字符串,并以逗号分隔。除非针对特定机器另有指定,否则汇编器用 0 字节标记每个字符串的结尾。

[...]

变体string16, string32 and string64不同于string伪操作码,其中每个 8 位字符来自str分别被复制并扩展为 16、32 或 64 位。扩展字符以目标字节顺序存储。

总而言之,之间的差异.string and .asciz:

  • 在某些架构(如下所列)中,.string不会添加空字节,当.asciz一直会。要测试您自己的系统,您可以这样做:

      echo '.string ""' | gcc -c -o stdout.o -xassembler -; objdump -sj .text stdout.o
    

    如果第一个字节是00,然后插入空字符。

  • .string还具有将字符扩展至特定宽度(16、32 或 64)的后缀,但默认情况下为 8。

正如问题评论中所述,在简单的用例中,除了语义之外没有任何区别。它们都支持转义序列并接受多个参数。然而从技术上讲,这两个伪操作由预处理器以不同的方式处理,并且不是别名。 (对比.zero and .skip,这是别名。)


关于.string,文档提到了两种行为不同的架构:

  • HPPA(HP Precision Architecture)——不加0,但有一个特殊的.stringz指令。
  • TI-C54X(德州仪器 (TI) 的 DSP 芯片) - 对每个字(2 个字节)的高 8 位进行零填充。有相关的.pstring打包字符并对未使用的空间进行零填充的指令。

深入挖掘源代码gas/config文件夹中,我们可以确认这一点并找到另一个:

  • IA64(英特尔架构)-.string and .stringz行为类似于 HPPA。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

.asciz 和 .string 汇编器指令之间有什么区别? 的相关文章

  • 在 ExtUtils::MakeMaker 下调用 gcc -pthread

    指定编译和链接的正确方法是什么 pthread not lpthread 在 Makefile PL 中 据我了解 应该调用 gcc pthread针对 pthread 进行构建时 因为此标志会扩展为正确的特定于平台的标志以进行编译和链接
  • MinGW:与 -nostdlib 链接会产生无效的可执行文件

    我花了过去几个小时尝试链接一个简单的 x86 汇编程序 而无需any使用 MinGW 的 CRT 初始化代码 我希望可执行文件只包含 main下面列出的方法和一次导入ExitProcess核函数 在反汇编程序中打开各种生成的文件表明 mai
  • C:带有 MinGW 的正则表达式库

    如何将 C 正则表达式安装到 MinGW 中 我正在使用它的 GCC 我正在运行 Windows XP 我更喜欢更新的 您有几个选择 mingw libgnurx http sourceforge net projects mingw fi
  • “丢失”jni.h 文件导致 JPostal 构建失败

    我想建设日本邮政 https github com openvenues jpostal building jpostal但发出命令后出现以下错误 gradlew assemble checking for gcj no checking
  • 未对齐的内存访问

    我正在开发不支持未对齐内存访问的嵌入式设备 对于视频解码器 我必须处理 8x8 像素块中的像素 每个像素一个字节 该设备具有一些 SIMD 处理功能 使我能够并行处理 4 个字节 问题是 8x8 像素块不能保证从对齐的地址开始 并且函数需要
  • 如何在 C 中使用 google 模拟?

    我正在维护一个用 C 编写的遗留项目 并且无法使用 C 编译器运行它 由于代码是交叉编译的 因此可以在主机环境中运行单元测试或类似测试 因此 也可以与 C 主机编译器交互并使用 google test 和 google mock googl
  • execve() 无法启动 C 程序

    我正在尝试使用生成一个新进程execve from unistd h在 Linux 上 我尝试向它传递以下参数execve bin ls bin ls NULL 但没有得到结果 我也没有收到错误 程序只是退出 发生这种情况有原因吗 我尝试以
  • mingw gcc 上的 __uint128_t

    我正在尝试在 mingw gcc 下编译 c 程序 该程序正在使用一个 uint128 t整数 当我尝试在同一台 64 位机器上的标准 ubuntu gcc 下编译它时 它完美地工作了 但是 当我尝试在 mingw 下为 Windows 编
  • 为什么 GCC 不自动矢量化这个循环?

    我正在尝试优化一个占用程序大量计算时间的循环 但是 当我使用 O3 ffast math ftree vectorizer verbose 6 GCC 输出打开自动矢量化时 它无法对循环进行矢量化 我正在使用海湾合作委员会4 4 5 代码
  • OSX - 将 gcc 版本 4.2.1 替换为通过 Homebrew 安装的 4.9

    这已经困扰我一段时间了 我正在尝试编译一个巨大的 C 文件 我知道它可以工作 因为它在我工作的 Arch Linux 计算机上工作得很好 当我在 mac 上检查 GCC 版本时 它返回以下内容 Configured with prefix
  • 如何阻止 Cygwin 下的 gcc 将“.exe”添加到已编译的可执行文件中?

    我想知道如何防止Cygwin下的gcc自动将 exe扩展名添加到编译文件中 因为我刚刚给自己带来了很多 丢失文件 的困惑 就上下文而言 我正在大学从事一个 C 项目 通常在运行 Ubuntu 与 Windows 双启动 的实验室工作 但在家
  • 深入了解事物如何打印到屏幕上(cout、printf)以及我在教科书上似乎找不到的真正复杂内容的起源

    我一直想知道这个问题 但至今还没有找到答案 每当我们使用 cout 或 printf 时 它们到底是如何打印在屏幕上的 文本是如何显示出来的 这里可能是一个相当模糊的问题 无论你给我什么 我都会工作 那么基本上这些功能是如何制作的 是汇编吗
  • GCC 编译器警告:扩展初始化列表仅适用于 c++0x

    使用此成员初 始化 StatsScreen StatsScreen GameState State level m Level level 我收到以下警告 extended initializer lists only available
  • 如何在 MacOS 上的 MARS 中打开保存的 .asm 文件

    我是 MIPS 的新手 我找不到如何打开我保存的文件 我在下载文件夹下保存了 asm 文件 但是当我尝试在 MARS 中打开文件并导航到同一下载文件夹时 asm 文件不会出现 我在 MacOS 上使用 MARS 如上所述 您需要在 macO
  • GCC -fstack-check 选项在 C 中引发什么异常

    根据 gcc 文档 fstack check 生成代码以验证您没有超出堆栈边界 请注意 此开关实际上并不导致检查完成 而是执行检查 操作系统必须这样做 该切换会导致代码生成 以确保操作系统看到正在扩展的堆栈 我的假设是这个额外的代码将生成异
  • RAM 到 RAM 的 DMA 传输

    我的一个朋友告诉我 在 x86 架构上 DMA 控制器无法在两个不同的 RAM 位置之间传输 它只能在RAM和外设 如PCI总线 之间传输 这是真的 因为 AFAIK DMA 控制器should能够在位于总线上并具有地址的任意设备之间 特别
  • asm、asm 易失性内存和破坏性内存之间的区别

    在实现无锁数据结构和定时代码时 通常需要抑制编译器的优化 通常人们使用asm volatile with memory在 clobber 列表中 但有时你会看到asm volatile或者只是一个简单的asm破坏记忆 这些不同的语句对代码生
  • 将 32 位值加载到 Arm 汇编中的寄存器中

    我想使用arm汇编将1个32位十六进制直接加载到寄存器中 mov r1 0x6c617669 这不能使用 因为从该指令我们只能加载 8 位值 所以我直接从内存加载32位值 那么如何将32位值存储在内存中并使用arm汇编将其直接加载到寄存器中
  • 所有版本的 GCC 都在与定义中具有默认类型的模板作斗争

    我浪费了无数时间来查明问题gcc 我想用另一个编译器测试我们的代码库 以查找更多警告Clang http en wikipedia org wiki Clang可能错过了 令我震惊的是 由于模板参数推导失败 几乎一半的项目停止了编译 在这里
  • ESP 和 EBP 寄存器是什么?

    我发现ESP寄存器是当前堆栈指针 EBP是当前堆栈帧的基指针 但是 我不理解这些定义 我刚刚开始学习如何在汇编程序中编码 What I understand is that ESP points towards the stack itse

随机推荐

  • F# 记录与 .net 结构

    f 记录与 net 结构相同吗 我看到人们谈论 f 结构 他们使用这个术语可以与 F 记录互换吗 像FSharp 运行我的算法比 Python 慢 https stackoverflow com questions 5850243 fsha
  • 如何在 Java 中更改客户端 TLS 首选项?

    我正在尝试向 Java 中的端点发出 POST 请求 当我尝试发送请求时 出现以下错误 Caused by javax net ssl SSLHandshakeException The server selected protocol v
  • 让 Eclipse 使用 src/test/resources 而不是 src/main/resources

    我正在 Eclipse 中编写一个小型 Maven 应用程序 我将一些属性文件和应用程序上下文存储在目录 src main resources 中 我现在想让 Eclipse 使用 src test resources 目录中的属性 所以当
  • 在三元条件下抛出新的异常[重复]

    这个问题在这里已经有答案了 我有这行代码 List
  • C# 十进制的类型后缀

    我不知道我想要实现的目标的正确措辞是什么 因此它可能已经发布在网上 如果是的话请善待 好吧 基本上我有这个方法 public static T IsNull
  • Docker-compose 在运行时使用 NGINX 扩展 Jetty

    我是码头工人的新手 我已经完成了一些教程来创建 docker compose 文件来创建 3 个 Jetty 1 个 NGINX 和 1 个 MySQL NGINX 充当具有循环机制的 LB 它按预期工作良好 如果我扩展我的jetty实例
  • Java NIO:IOException:损坏的管道是什么意思? [复制]

    这个问题在这里已经有答案了 对于我的一些 Java NIO 连接 当我有SocketChannel write ByteBuffer 调用 它会抛出一个IOException 管道破损 是什么导致 管道破裂 更重要的是 是否有可能从该状态恢
  • iBeacons:如果应用程序在后台,locationManager:didEnterRegion:仅在锁屏显示时调用

    我正在开发一个监视 iBeacon 区域的 iOS 应用程序 当应用程序在后台运行时 我希望它在遇到特定的 iBeacon 区域时发送本地通知 一切工作正常 除了一件事 locationManager didEnterRegion 显然不会
  • 绘制植物雌性和雄性性相持续时间

    我很难弄清楚如何我们可以创建一个折线图 其中 Y 轴和 X 轴上都有单个植物一条连续的线分为植物各自的开放期 性期和枯萎期 我有大约 60 株植物 每株都有 5 到 15 朵花 以及它们各自的开放日期 进入雄性阶段的日期 进入雌性阶段的日期
  • 配置 log4j 在运行时记录到自定义文件

    任何人都可以指导我如何配置 log4j 以记录到我在运行时指定的特定文件 日志文件的名称和路径是在运行时生成的 应用程序必须记录到该特定文件 通常 log4j properties 文件中的文件附加器条目指向应用程序将使用的日志文件 但是在
  • 快速且Python式地确定字符串是否为回文的方法

    编辑 正如有人指出我不正确地使用了回文概念 现在我已经使用正确的函数进行了编辑 我还在第一个和第三个示例中做了一些优化 其中 for 语句一直运行到到达字符串的一半 我为检查字符串是否为回文的方法编写了三个不同版本的代码 该方法作为类 st
  • 如何使用 Tesseract-android-Tools

    我有 tesseract android tools 1 00 请帮助我使用 TessBaseAPI 接口 我只想将一个 jpg 图像传递给一个 Android 应用程序 该应用程序将一些文本作为图像的一部分 然后通过这个超立方体引擎我想将
  • Firefox 无法正确渲染 svg

    我在 Firefox 中遇到了这个问题 或者可能是我使用了错误的东西 但我使用的是这样的 svg 图像 img src image svg alt some image 浏览器将它们呈现如下 我可以让他们像 png它工作得很好 但我需要它们
  • PHP字符串计算[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我的问题是 在 PHP 中如何从字符
  • System.InvalidOperationException:异步操作尚未完成

    安装导致 Ml net 异常的管道 这Fit不是一个等待的事情 我很困惑为什么会发生这种情况 任何帮助都是值得赞赏的 var model pipeline Fit dataView 堆栈跟踪 在 System Threading Chann
  • 启动时自动运行 EFI 应用程序

    I can 构建并手动执行 http sourceforge net apps mediawiki tianocore index php title Getting Started Writing Simple ApplicationUE
  • Python:返回完整单词而不仅仅是字符串的特定部分(正则表达式)

    我最近刚刚开始学习 Python 并且已经 深入 到了正则表达式 我的任务看起来相当简单 我只需要编写一个从字符串返回某些单词的正则表达式 规则如下 单词只能包含一组元音 换句话说 它是一个不完美但简单的正则表达式 旨在从文本中返回一个音节
  • 获取Python中类的类路径或名称空间,即使它是嵌套的

    我目前正在用 Python 编写一个序列化模块 可以序列化用户定义的类 为了做到这一点 我需要获取对象的完整名称空间并将其写入文件 然后我可以使用该字符串重新创建该对象 例如 假设我们在名为的文件中有以下类结构A py class B cl
  • Nifi 无法使用 POI API 将 CSV 转换为 Excel

    我想使用 groovy 脚本 POI API 将 csv 流文件内容转换为 XLS 文件 我正在使用 ivy 来获取 POI 依赖项 看起来效果很好 请在下面找到更多详细信息 这是我的 Nifi 流程 这是我的脚本 Grapes Grab
  • .asciz 和 .string 汇编器指令之间有什么区别?

    我知道 ascii指令不会在字符串末尾放置空字符 因为 asciz指令就是用于此目的 不过 我不知道是否 string指令在字符串末尾放置一个空字符 如果它确实附加了空字符 那么两者之间有什么区别 asciz和 string指令 对我来说