Assembly AT&;T语法

Assembly AT&;T语法,assembly,x86,gnu-assembler,att,Assembly,X86,Gnu Assembler,Att,我很难找到中概述的“resb”指令的等效操作 我也很难找到“db”、“dw”等的等价词。 它们似乎分别对应于“db”、“dw”和“dd”,分别是“.byte”、“.short”和“.long”,但我不确定,因为我只是从随机代码片段中收集到的。我找不到与“dq”相等的词 是否有人知道这些伪操作的正确等价物,以及可能详尽列出所有AT&T语法等价物的参考资料?阅读GAS手册()以获得其支持的指令的详尽列表。请注意,GAS支持的所有目标的指令基本相同,并不特定于x86 AT&T语法。它们的设计理念与NA

我很难找到中概述的“resb”指令的等效操作

我也很难找到“db”、“dw”等的等价词。 它们似乎分别对应于“db”、“dw”和“dd”,分别是“.byte”、“.short”和“.long”,但我不确定,因为我只是从随机代码片段中收集到的。我找不到与“dq”相等的词

是否有人知道这些伪操作的正确等价物,以及可能详尽列出所有AT&T语法等价物的参考资料?

阅读GAS手册()以获得其支持的指令的详尽列表。请注意,GAS支持的所有目标的指令基本相同,并不特定于x86 AT&T语法。它们的设计理念与NASM/YASM稍有不同,但至少您不必为ARM、AARC64、RISC-V或其他产品重新学习它们

一般来说,如果您需要了解如何使用GAS语法,请查看手册和/或编译一些需要执行相同操作的C,例如编译
intfoo自动保存在文件中

GAS语法没有与
resw/d/q
等效的语法,只有
resb
相同事物有三个同义词的冗余来自GAS,旨在与各种历史Unix供应商提供的汇编程序兼容

此外,您可以在BSS中保留空间,而无需使用
.section.BSS
(或仅使用
.BSS
)切换到该节,然后使用(非导出符号)或
.comm
(全局符号)返回

您必须手动将元素计数乘以2/4/8以获得字节计数,如

.lcomm  private_32byte_bss_object, 4*8
我认为这在逻辑上等同于
.pushsection.bss
<代码>标签:。空格…
<代码>.popsection

IIRC,如果要使用
.p2align
对bss对象进行额外对齐,则可能需要
.section.bss
。或者使用第三个参数
.lcommm

有些目标允许第三个参数与.lcomm一起使用。此参数指定bss部分中符号的所需对齐方式

阅读GAS手册()以获取其支持的指令的详尽列表。请注意,GAS支持的所有目标的指令基本相同,并不特定于x86 AT&T语法。它们的设计理念与NASM/YASM稍有不同,但至少您不必为ARM、AARC64、RISC-V或其他产品重新学习它们

一般来说,如果您需要了解如何使用GAS语法,请查看手册和/或编译一些需要执行相同操作的C,例如编译
intfoo自动保存在文件中

GAS语法没有与
resw/d/q
等效的语法,只有
resb
相同事物有三个同义词的冗余来自GAS,旨在与各种历史Unix供应商提供的汇编程序兼容

此外,您可以在BSS中保留空间,而无需使用
.section.BSS
(或仅使用
.BSS
)切换到该节,然后使用(非导出符号)或
.comm
(全局符号)返回

您必须手动将元素计数乘以2/4/8以获得字节计数,如

.lcomm  private_32byte_bss_object, 4*8
我认为这在逻辑上等同于
.pushsection.bss
<代码>标签:。空格…
<代码>.popsection

IIRC,如果要使用
.p2align
对bss对象进行额外对齐,则可能需要
.section.bss
。或者使用第三个参数
.lcommm

有些目标允许第三个参数与.lcomm一起使用。此参数指定bss部分中符号的所需对齐方式


对于
dq
使用
.quad
。有关详细信息,请阅读。对于
dq
使用
.quad
。详情请阅读,谢谢!考虑到指令在所有平台上都是通用的,这就更有意义了。在编写x86 ELF时,我假设“.short”和“.long”与“.2byte”和“.4byte”相同?出于类似的原因?我注意到一些命令,如.intel_语法和.att_语法,似乎对我不起作用,但没有返回错误消息。是否有些指令没有错误消息说明使用不正确,或者这仅仅意味着不支持它?另外,关于切换到bss和返回。我注意到您使用了.pushsection和.popsection,但我是否也可以使用.section.bss然后使用.section.text(如果我以前在文本部分中)?我对是否允许重复使用这样的节感到困惑。@23scurtu:是的,如果您知道以前所在的节,您可以使用
.section.text
或简单地使用
.text
。我之所以使用push/pop部分,是因为我准确地描述了
.lcomm
在一般情况下是如何工作的。将节视为可以在多个输出流之间切换的多个输出流,每个输出流最终将在
.o
对象文件中连续。(然后在链接时,每个部分将被链接到可执行文件中的ELF段。)@23scurtu:
。对于GAS和clang的内置汇编程序,intel\u语法noprefix
对我来说都很好。你可能忘记了
noprefix
部分,所以汇编程序仍然在寻找寄存器名上的
%
装饰,在一个弗兰肯斯坦的语法组合中?是的,关于.short和.long,你是对的。我再次尝试使用
.intel\u语法noprefix
,现在它可以工作了。我意识到我之前遇到的错误是由于使用了不支持的包含NASM指令的英特尔语法代码,即使使用了
.intel\u syntax noprefix
。还有什么方法可以支持nasm指令吗?谢谢!考虑到指令在所有平台上都很常见,这就更有意义了