Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly MASM EQU和TEXTEQU指令之间的差异_Assembly_Masm_Directive - Fatal编程技术网

Assembly MASM EQU和TEXTEQU指令之间的差异

Assembly MASM EQU和TEXTEQU指令之间的差异,assembly,masm,directive,Assembly,Masm,Directive,我试图理解MASM和指令之间的区别。到目前为止,我所能收集到的只是语法略有不同,eq宏不能重新定义,而texteq宏可以重新定义。在我看来,它们仍然非常相似,那么还有其他区别吗?在什么情况下我应该使用eq而不是texteq,反之亦然?eq更通用,因为它允许数值常量和文本常量。EQU还明确声明声明声明后可以更改文本值。虽然“名称以后不能重新定义”这句话令人困惑,但它只适用于第一种形式的eq“名称eq表达式”,而第二种形式的eq“名称eq”则被注释为“名称以后可以分配不同的文本” 另一方面,text

我试图理解MASM和指令之间的区别。到目前为止,我所能收集到的只是语法略有不同,
eq
宏不能重新定义,而
texteq
宏可以重新定义。在我看来,它们仍然非常相似,那么还有其他区别吗?在什么情况下我应该使用
eq
而不是
texteq
,反之亦然?

eq更通用,因为它允许数值常量和文本常量。EQU还明确声明声明声明后可以更改文本值。虽然“名称以后不能重新定义”这句话令人困惑,但它只适用于第一种形式的
eq
“名称eq表达式”,而第二种形式的
eq
“名称eq”则被注释为“名称以后可以分配不同的文本”

另一方面,texteq只处理文本文字。使用普通双引号文本、按%(我从未见过)进行的文字以及宏的值。EQU似乎不支持后两种类型,但我还没有对此进行测试


在大多数情况下,如果您只创建双引号变体的文本常量,它们似乎是可互换的。

请参阅的第8.5节。无承诺,因为这不完全是您的问题,但这并不是完全偏离你的要求:如果这没有帮助的话,再问一些。实时链接:MASM
eq
是否会在
eq
的位置当场计算
msglen eq$-msg
之类的表达式,或者它会将
$-msg
替换到使用它的地方?我认为FASM是后者(导致尺寸太大),而NASM是前者。在FASM中,修复方法是使用
msglen=$-msg
,我认为MASM还支持数值表达式的
=
。据我所知,EQU和TEXTEQU是在汇编过程中扩展的指令。也就是说,当代码转换为机器代码时,它们的引用被替换为它们的实际值。该值不会存储在内存中并在以后引用。我不确定如果不明确地为它分配内存,那该怎么办。当然可以,但问题是它是在你写
eq
的地方被计算为一个数字,还是在你使用符号的每个地方被重新计算。e、 g.写入
mov ecx,msglen
是否为您提供了正确的数字,或者它是否完全等同于写入
mov ecx,$-msg
,而不是在
msg
之后的某个位置。指令的值只计算一次,然后在组装期间存储在键/值存储中。指令名称的每次使用都会被替换为原始的常量值。这是它按预期工作的唯一方式。这是它在NASM中的工作方式,而不是在FASM中的工作方式。我这样问是因为我不知道MASM中预期的行为是什么,没有实际使用它。谢谢你的澄清;也许值得在你的答案中加入这一点。