在 NASM 中使用 istruc 时:“警告:尝试初始化 BSS 部分‘.bss’中的内存:忽略 [-w+other]”

2024-04-23

在搜索这个错误时我发现this https://stackoverflow.com/questions/65731514/nasm-attempt-to-initialize-memory-in-bss-section/77001709问题,但不完全是我的问题。一段时间后,我找出了问题所在,并在该问题中发布了另一个答案,但根据@ecm的建议,我决定提出一个不同的问题。

我的问题是,不久前我宣布了 nasmstruc像这样 (请注意,没有.b):

struc ctx_t
    .next: resd 1
    .prev: resd 1
    .a:    resd 1
    .c:    resd 1
endstruc

一段时间后我添加了一个.b member:

struc ctx_t
    .next: resd 1
    .prev: resd 1
    .a:    resd 1
    .b:    resd 1
    .c:    resd 1
endstruc

但忘记编辑结构的实际使用istruc在另一个文件中:

section .bss
    first_ctx:
        istruc ctx_t
            at ctx_t.next, resd 1
            at ctx_t.prev, resd 1
            at ctx_t.a,    resd 1
            ; Missing b!
            at ctx_t.c,    resd 1
        iend

汇编器给了我这些警告(全部在ctx_t.c line):

src/file.asm:8: warning: attempt to initialize memory in BSS section `.bss': ignored [-w+other]
src/file.asm:8: warning: attempt to initialize memory in BSS section `.bss': ignored [-w+other]
src/file.asm:8: warning: attempt to initialize memory in BSS section `.bss': ignored [-w+other]
src/file.asm:8: warning: attempt to initialize memory in BSS section `.bss': ignored [-w+other]

问:为什么会出现这个警告?为什么是四次?如何避免呢?


这里还有一些解决方案。首先,一个重现原始问题的测试用例(在一个可以按原样组装的文件中):

struc ctx_t
    .next: resd 1
    .prev: resd 1
    .a:    resd 1
    .b:    resd 1
    .c:    resd 1
endstruc

section .bss
    first_ctx:
        istruc ctx_t
            at ctx_t.next, resd 1
            at ctx_t.prev, resd 1
            at ctx_t.a,    resd 1
            ; Missing b!
            at ctx_t.c,    resd 1
        iend

    resb 16

然后,我的第一个解决方案。我们使用单独的多行宏(mmacros)专门用于nobits部分,命名为bss_istruc和朋友。 (这bss_istruc宏本身只是 NASM 的精确副本istruc,但与此处的其他两个 mmmacros 一起定义它是一致的。)这是唯一需要更改代码的解决方案,而不仅仅是添加一些宏。


%imacro bss_istruc 1.nolist
    %push
        %define %$strucname %1
        %$strucstart:
%endmacro

%imacro bss_at 1-2+.nolist
    %defstr %$member %1
    %substr %$member1 %$member 1
    %ifidn %$member1, '.'
        resb (%$strucname%1-%$strucname)-($-%$strucstart)
    %else
        resb (%1-%$strucname)-($-%$strucstart)
    %endif
    %2
%endmacro

%imacro bss_iend 0.nolist
        resb %{$strucname}_size-($-%$strucstart)
    %pop
%endmacro


struc ctx_t
    .next: resd 1
    .prev: resd 1
    .a:    resd 1
    .b:    resd 1
    .c:    resd 1
endstruc

section .bss
    first_ctx:
        bss_istruc ctx_t
            bss_at ctx_t.next, resd 1
            bss_at ctx_t.prev, resd 1
            bss_at ctx_t.a,    resd 1
            ; Missing b!
            bss_at ctx_t.c,    resd 1
        bss_iend

    resb 16

接下来是我的第二个解决方案。我们取消了 NASM 的原始定义istruc和朋友,并用检查的 mmacros 替换它们.bss部分,按名称,并将使用resb 1当它被检测到时,否则db 0。显然,如果你使用nobits除了指定的部分之外的其他部分.bss,您必须修改检测才能使其工作。

它还期望 mmmacros 仅在普通之后使用section .bss or segment .bss指令。如果您想指定部分属性(例如follows=, align=等),那么您需要随后添加另一个section仅命名不带属性的节名称的指令。 (无论如何,这是一个很好的形式,因为使用__SECT__宏会警告您是否最后一次section指令包含属性。)


%unimacro istruc 1.nolist
%unimacro at 1-2+.nolist
%unimacro iend 0.nolist

%imacro istruc 1.nolist
    %push
        %define %$strucname %1
        %$strucstart:
 %ifidni __SECT__, [section .bss]
    %define %$reservespace resb 1
 %elifidni __SECT__, [segment .bss]
    %define %$reservespace resb 1
 %else
    %define %$reservespace db 0
 %endif
%endmacro

%imacro at 1-2+.nolist
    %defstr %$member %1
    %substr %$member1 %$member 1
    %ifidn %$member1, '.'
        times (%$strucname%1-%$strucname)-($-%$strucstart) %$reservespace
    %else
        times (%1-%$strucname)-($-%$strucstart) %$reservespace
    %endif
    %2
%endmacro

%imacro iend 0.nolist
        times %{$strucname}_size-($-%$strucstart) %$reservespace
    %pop
%endmacro


struc ctx_t
    .next: resd 1
    .prev: resd 1
    .a:    resd 1
    .b:    resd 1
    .c:    resd 1
endstruc

section .bss
    first_ctx:
        istruc ctx_t
            at ctx_t.next, resd 1
            at ctx_t.prev, resd 1
            at ctx_t.a,    resd 1
            ; Missing b!
            at ctx_t.c,    resd 1
        iend

    resb 16

接下来,一个解决方案not work。这个想法是替换使用db 0在 mmacros 中,通过一个宏将扩展为多个resb指令。这不起作用,因为times是汇编器指令,而不是预处理器指令,因此db 0从未被评估为 mmmacro。谨在此转载,供后人参考。


struc ctx_t
    .next: resd 1
    .prev: resd 1
    .a:    resd 1
    .b:    resd 1
    .c:    resd 1
endstruc

section .bss
    first_ctx:

%imacro resb_for_every 1-*.nolist
 %rep %0
  %ifstr %1
   %strlen %%length %1
    resb %%length
  %else
    resb 1
  %endif
  %rotate 1
 %endrep
%endmacro

%idefine db resb_for_every

        istruc ctx_t
            at ctx_t.next, resd 1
            at ctx_t.prev, resd 1
            at ctx_t.a,    resd 1
            ; Missing b!
            at ctx_t.c,    resd 1
        iend

%undef db

    resb 16

接下来,对上述内容进行修订,通过使用only单行宏 (smacro) 定义db。这是一个超级黑客解决方案,但如果你注意只替换它,它确实有效db 0使用这个技巧。 (ETA:稍微修改以允许任何db只需一个号码即可工作。)


struc ctx_t
    .next: resd 1
    .prev: resd 1
    .a:    resd 1
    .b:    resd 1
    .c:    resd 1
endstruc

section .bss
    first_ctx:

%idefine db resb 1 + 0 *

        istruc ctx_t
            at ctx_t.next, resd 1
            at ctx_t.prev, resd 1
            at ctx_t.a,    resd 1
            ; Missing b!
            at ctx_t.c,    resd 1
        iend

%undef db

    resb 16

最后,另一种非工作解决方案:db指令,我们替换times由特殊的宏指令。该宏将检查 db 0字符串位于其参数末尾,使其比之前的黑客更安全。

struc ctx_t
    .next: resd 1
    .prev: resd 1
    .a:    resd 1
    .b:    resd 1
    .c:    resd 1
endstruc

section .bss
    first_ctx:

%imacro times_resb 1+.nolist
 %defstr %%our_string %1
 %strlen %%our_string_length %%our_string
 %substr %%our_db_0 %%our_string %%our_string_length + 1 - 5,-1
 %ifidni %%our_db_0, " db 0"
  %substr %%our_number_string %%our_string 1,-6
  %deftok %%our_number_token %%our_number_string
    resb %%our_number_token
 %else
  %error Unexpected use of times_resb macro: %%our_string %%our_db_0
 %endif
%endmacro

%idefine times times_resb

        istruc ctx_t
            at ctx_t.next, resd 1
            at ctx_t.prev, resd 1
            at ctx_t.a,    resd 1
            ; Missing b!
            at ctx_t.c,    resd 1
        iend

%undef times

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

在 NASM 中使用 istruc 时:“警告:尝试初始化 BSS 部分‘.bss’中的内存:忽略 [-w+other]” 的相关文章

  • 在 REP MOVSW 之前 PUSH CS / POP DS 的目的是什么?

    为什么在下面的代码中我们压入代码段 PUSH CS 然后将其弹出到数据段 POP DS 我将这些行明确指定为 line1 和 line2 请告诉我 MOVSW 在这里是如何工作的 IF HIGHMEMORY PUSH DS MOV BX D
  • 在 g++ 中链接文件

    最近我尝试用g 在Ubuntu上 编译一个程序 通常我使用 Dev C 在 Windows 上 只要我创建一个项目并将所有必要的文件放入其中 它就可以正常工作 编译程序时出现的错误是 filename cpp undefined refer
  • 与可变结构相比,不可变结构有哪些优点?

    我已经知道不变性相对于可变性的好处在于能够推理代码并引入更少的错误 尤其是在多线程代码中 不过 在创建结构时 我看不出创建一个完全不可变的结构比创建一个可变的结构有任何好处 让我们以保存一些分数的结构为例 struct ScoreKeepe
  • 如何解决警告“没有明确的所有权”

    我有一种方法 它采用间接指针作为参数 然后 如果出现错误 将其设置为错误对象 我正在尝试打开尽可能多的警告 但其中之一 Implicit ownership types on out parameters 在此方法中生成警告 id doWi
  • 如何可视化内存中带有位域的 C 结构体的布局?

    我正在使用包括位字段的 C 结构 如下所示 struct beeper general t uint1 t enable 1 uint32 t 7 enum2 t loudness 2 uint32 t 22 enum2 t status
  • 当我删除 @synthesize 语句时出现编译器错误“使用未声明的标识符”

    在最新的 LLVM 版本中 综合属性的要求已被删除 因此我能够删除我所有的 synthesize声明 除了以下声明NSFetchedResultsController 有谁知道为什么当我删除时编译器会警告我 synthesize fetch
  • 为什么Java不支持结构体? (只是出于好奇)

    我知道您可以使用公共字段或其他一些解决方法 或者也许你根本不需要它们 但只是出于好奇为什么 Sun 没有考虑结构 这是一个link http www oracle com technetwork java simple 142616 htm
  • 如何将 typedef 结构传递给函数?

    此刻我正在努力 void avg everything 但这给了我错误 error subscripted value is neither array nor pointer 当我今天早些时候收到此错误时 这是 因为我没有正确地将 2D
  • orpd等SSE2指令有什么意义?

    The orpd指令是 压缩双精度浮点值的按位逻辑或 这不是做完 全相同的事情吗por 按位逻辑或 如果是这样 拥有它还有什么意义呢 请记住 SSE1orps https www felixcloutier com x86 orps首先 实
  • 汇编-符号标志和奇偶校验标志

    我不明白什么时候设置标志标志 什么时候设置奇偶校验 据我所知 符号标志表示运算结果的符号 0表示正数 1表示负数 那么为什么在下一个代码中 mov al 5 sub al 124 SF为零 结果是负数 关于PF 为什么a和b中设置了PF a
  • 在 C 中初始化结构体的静态数组

    我正在用 C 实现一个纸牌游戏 纸牌有很多种类型 每种纸牌都有大量信息 包括一些需要单独编写与其关联的脚本的操作 给定这样的结构 并且我不确定我的语法是否适合函数指针 struct CARD int value int cost This
  • 为什么 Visual Studio 使用 xchg ax,ax

    我正在查看程序的反汇编 因为它崩溃了 并注意到很多 xchg ax ax 我用谷歌搜索了一下 发现它本质上是一个 nop 但是为什么 Visual Studio 会执行 xchg 而不是 noop 该应用程序是一个C NET3 5 64位应
  • 减法进位标志

    我正在使用 MASM32 有了这个代码 mov eax 5 sub eax 10 CF 状态标志将被设置 但使用我的铅笔和纸 我实际上看到 MSB 没有任何进位 是的 我知道从较少的数字中减去大的数字集CF 但我想知道为什么 因为使用这段代
  • PyCharm 可以列出项目中的所有 Python 错误吗?

    我在虚拟环境中使用 python 2 7 和 PyCharm 2 7 2013 年 2 月 7 日的新版本 每当我打开其中有明确错误的Python文件 相当于其他语言中的编译错误 例如使用未声明的变量 调用不存在的函数 时 它会在文件的装订
  • 结构体前向声明编译失败

    我有以下代码 但编译器说 sender wrapper 未定义 即使我向前声明了它 我不能对结构进行前向声明吗 用VS2003编译 struct send wrapper struct IPSend IPSend IPSend const
  • 在 x86-64 CPU 上通过交叉修改代码重现意外行为

    Question 对于可能在 x86 或 x86 x64 系统上触发意外行为的交叉修改代码有哪些想法 在这些系统中 交叉修改代码中的所有操作均已正确完成 但在执行处理器之前执行序列化指令除外修改代码 如下所述 我有一个 Core 2 Duo
  • 无法访问类“std::basic_ios<_Elem,_Traits>”中声明的私有成员

    此特定方法有问题 不知道如何解决 我收到的错误是上面的 错误 C2248 std basic ios basic ios 不能 访问类中声明的私有成员 std basic ios C Program Files Microsoft Visu
  • 通过鼻子测试检查某个函数是否发出警告

    我正在使用编写单元测试nose http somethingaboutorange com mrl projects nose 0 11 2 我想检查函数是否引发警告 该函数使用warnings warn 这是很容易就能做到的事情吗 def
  • 找到的程序集的清单定义与程序集引用不匹配

    我试图在 C Windows 窗体应用程序 Visual Studio 2005 中运行一些单元测试 但出现以下错误 System IO FileLoadException 无法加载文件或程序集 实用程序 版本 1 2 0 200 文化 中
  • 有没有办法使用 i387 fsqrt 指令获得正确的舍入?

    有没有办法使用 i387 fsqrt 指令获得正确的舍入 除了改变精确模式在 x87 控制字中 我知道这是可能的 但这不是一个合理的解决方案 因为它存在令人讨厌的重入型问题 如果 sqrt 操作中断 精度模式将出错 我正在处理的问题如下 x

随机推荐

  • 分阶段加载 spring 上下文

    这是人们会问的奇怪问题之一 为什么 所以我将从我为什么要这样做开始 然后讨论这个问题 我想更好地控制 spring 上下文的加载方式 例如 我不想同时加载域和web api 这将使资源在其依赖项准备好之前可用 也可能我需要检查某些东西的状态
  • 禁用对特定主机的警报,同时对所有其他主机发出警报

    我有数百台主机向普罗米修斯服务器报告 我的每个主机有很多出口商 我希望能够列出我不希望收到警报的主机列表 我仍然需要对这些主机进行普罗米修斯监控 我尝试过匹配没有接收器的路线 这不起作用 我究竟做错了什么 或者说 我应该怎么做 我的路线规则
  • 为什么 pgAdmin 4 这么慢?

    postgreSQL 的 pgAdmin 4 GUI 非常慢 即使扩展服务器树或数据库树也需要花费太多时间 它们各自花费了近 30 秒的时间来展开 创建新数据库或表时它也会挂起 即使加载后 创建和保存新数据库也需要一分多钟的时间 几乎每次我
  • 回形针未保存,没有错误

    我被绊倒了 浏览了文档 教程等 但不确定我做错了什么 项目中的另一个模型是为 Paperclip 设置的 并且在测试时可以正常工作 它将附件文件信息保存和检索到数据库中 并将文件放入 public system 内的子文件夹中 我基本上将相
  • jQuery 剪贴板复制

    我需要剪贴板复制功能 即使我正在寻求帮助http plugins jquery com project copy http plugins jquery com project copy链接 但无法正常工作 li li
  • Spark:相当于数据帧中的 zipwithindex

    假设我有以下数据框 dummy data a 1 b 25 c 3 d 8 e 1 df sc parallelize dummy data toDF letter number 我想创建以下数据框 a 0 b 2 c 1 d 3 e 0
  • 从坐标中提取地址分量

    我正在尝试使用 R 进行反向地理编码 我首先使用了 ggmap 但无法让它与我的 API 密钥一起使用 现在我正在用 googleway 尝试 newframe c Front lat Front long Front lat Front
  • 共享苹果付费开发者帐户的选项?

    问题 这里正确的程序是什么 Do both the developer and account holder need paid Apple Developer accounts 正如在下面的上下文中所说 我的客户已经有一个 我还需要一个付
  • Kotlin 中 ArrayList() 和 mutableListOf() 之间的区别

    private val repositories mutableListOf
  • 在 ResourceDictionary 文件中使用 viewbox

    我有 ResourceFile1 xaml 文件 其内容
  • 在控制器中使用 Angular 的 $watch 是反模式吗?

    在我永无休止地追求以 正确的 角度方式做事的过程中 我阅读了很多有关如何让控制器观察角度服务中保存的模型变化的文章 一些网站 http www benlesh com 2013 08 angularjs watch digest and a
  • 如何在单页应用程序中实现 gmail 撰写窗口概念?

    我正在开发一个项目 用户可以更轻松地快速添加交易 我非常有兴趣做一些类似于 gmail 撰写弹出窗口在单页上所做的事情 我不知道如何实现这样的事情 请给我指导如何做这些事情 我有兴趣使用 AngularJS 构建它 P S 抱歉问了一个宽泛
  • 包 oracle.jdbc.driver 不存在

    以下代码出错 发生错误 1 import java sql public class DBConnect public static void main String a throws SQLException package oracle
  • 如何使用脚本。在 JADE 模板中

    我使用 JADE 模板使用 Express 框架创建了一个简单的节点应用程序 学习过程中一切都很顺利 直到我开始尝试运行一些客户端 js 但我不知道该怎么做 我需要在 app index js 中做一些事情来告诉节点它们吗 任何帮助将非常感
  • 从相关系数计算中删除异常值

    假设我们有两个数值向量x and y 之间的皮尔逊相关系数x and y是 谁 给的 坐标 x y 我怎样才能自动考虑仅一个子集x and y在计算中 比如90 最大化相关系数 If you really想要做到这一点 删除最大 绝对 残差
  • Boost 互斥范围锁

    我正在阅读 drdobbs com 上的 Boost Mutex 教程 并发现了这段代码 include
  • GNU gdb 如何显示源文件名和符号行

    当使用 GNU gdb 调试 c 进程时 list 命令将打印行但不告诉我文件名 设置断点可以显示我想要的所有行和文件信息 但我不想设置断点并且必须禁用或删除它 gdb b oyss funtion Breakpoint 13 at 0x8
  • 如何在 Google Chrome 扩展程序中创建侧边栏?

    我正在考虑在 Google Chrome 中创建一个侧边栏扩展 并读到有一个 API 调用 Google 禁用了它 那么也许有人知道如何创建并有例子吗 不幸的是 侧边栏 API 工作最近已停止 https bugs chromium org
  • Tkinter 按钮在禁用和更新后仍然响应点击

    我希望按钮启动命令 然后在执行时禁用并在执行完成后再次启用 当我单击该按钮时 它似乎被禁用并且命令被执行 但是 当我在禁用按钮时单击该按钮时 该命令会在第一次执行完成后第二次执行 似乎在第二次单击后 该按钮确实被禁用了 因为我可以在禁用它时
  • 在 NASM 中使用 istruc 时:“警告:尝试初始化 BSS 部分‘.bss’中的内存:忽略 [-w+other]”

    在搜索这个错误时我发现this https stackoverflow com questions 65731514 nasm attempt to initialize memory in bss section 77001709问题 但