【问题标题】:Fail assembly if file is too large in gnu as如果文件在 gnu 中太大,则组装失败
【发布时间】:2019-09-29 14:11:13
【问题描述】:

我正在尝试组装一个二进制文件必须适合特定大小的文件。我一直在尝试看看是否有一种方法可以让汇编器失败,如果它太大以至于我知道。我在想这样的事情:

.if . > 0x200
.error “binary too large”
.endif

但这不起作用,因为 if 表达式不是绝对的。我也试过用标签来做,但它也不起作用。有没有办法用指令或在 as 中做到这一点?

【问题讨论】:

  • 这是用于引导加载程序吗?

标签: assembly gnu-assembler


【解决方案1】:

显然,如果您将当前地址设置为小于应有的值,则组装将失败。所以结束文件

. = 0x200

如果文件比那个大,as 会引发错误。

编辑:正如@fuz 所指出的,这会将文件填充到那个大小,如果这对你来说是个问题,我没有答案。

【讨论】:

  • 请注意,这会将您的二进制文件填充到您可能不想要的大小。
  • @fuz 是的,我知道。就我个人而言,我对此表示满意,但我将编辑答案,以便其他人看到他们知道。
  • 我可以稍后为此写一个正确的答案。诀窍是使用 if 指令,该指令具有通过获取两个标签之间的差异而获得的绝对值。
  • @fuz :我想写一个答案,直到我了解到由于某种原因从同一部分中的当前位置计数器(甚至两个标签之间的差异)中减去一个标签会导致错误提示价值不是绝对的。这两个标签都是在检查完成之前定义的,所以即使像as 这样的单通道汇编程序也应该能够弄清楚。我没有尝试使用早期版本的 binutils 来查看它是否一直如此。我闻起来像虫子。
【解决方案2】:

在最后一次传递期间在组装时查询段大小对我来说似乎很有用,这就是为什么属性 SIZE# 能够在 EuroAssembler 中检索此信息的原因。

因此,如果您不坚持 GNU as,这可行:

binary PROGRAM
%AllowedSize %SETA 9
[DATA] SEGMENT         ; Common segment for code and data.
  DB "1234567890"      ; Example of data contents.
  %IF SIZE# [DATA] > %AllowedSize
    %ERROR Size of program "binary" exceeds %AllowedSize.
  %ENDIF
  ENDPROGRAM

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-13
    • 1970-01-01
    • 2011-12-07
    • 1970-01-01
    • 1970-01-01
    • 2021-01-02
    • 1970-01-01
    相关资源
    最近更新 更多