我有这个FASM代码:
msg1:
db "hello", 0
msg1_len equ $ - msg1; should be 6
尽管msg1_len应该是6,但是当我调试它时,它会返回一个奇怪的大数字,例如4570.也就是说," msg1_len"等于4570
在其他应用程序中它是相同的 - 一个大的,随机的数字而不是字符串的长度。
这是为什么?如何解决?
答案 0 :(得分:2)
编辑:ooops ....我确实使用了=
,而不是equ
。
当我用=
替换equ
时,出现编译错误:
helloworld.asm [13]:
mov edx,msg1_size ; Length of message
error: undefined symbol 'msg1_size'.
(flat assembler version 1.71.51)
适合我,当我把它放入可编辑的FASM示例中时,我得到6
。
我用来验证它的完整代码是否正常工作:
format ELF executable 3
entry start
;================== code =====================
segment readable executable
;=============================================
start:
mov eax,4 ; System call 'write'
mov ebx,1 ; 'stdout'
mov ecx,msg1 ; Address of message
mov edx,msg1_size ; Length of message
^^这个编译为mov edx,6
,在调试器中验证。
int 0x80 ; All system calls are done via this interrupt
mov eax,1 ; System call 'exit'
xor ebx,ebx ; Exitcode: 0 ('xor ebx,ebx' saves time; 'mov ebx, 0' would be slower)
int 0x80
;================== data =====================
segment readable writeable
;=============================================
msg1:
db 'hello', 0
msg1_size = $-msg1
最终(?)更新:
查看有关2.2.1 Numerical constants的FASM文档:
=
指令允许定义数值常量。它应该以常量的名称开头,后跟提供值的数值表达式。这些常量的值可以是数字或地址,但是 - 与标签不同 - 数字常量不允许保存基于寄存器的地址。除了这种差异之外,在它们的基本变体中,数字常量的行为与标签非常相似,甚至可以向前引用它们(在实际定义之前访问它们的值)。
符号常量与数值常量不同,在汇编过程之前,它们在定义后的源行中的每个值都被替换,任何东西都可以成为它们的值。
符号常量的定义由常量的名称后跟
equ
指令组成。遵循此指令的所有内容都将成为常量的值。如果符号常量的值包含其他符号常量,则在将此值赋给新常量之前,它们将替换为它们的值。
=
代替equ
(在FASM中)。(用于计算数字常量,我的意思是..你仍然可以使用equ
作为符号常量......对我来说就像宏定义一样)
你得到了很大的常数,因为你在代码之前定义了这个符号,并且在编译期间它做了mov edx,$ - msg1
之类的事情,其中$
已经是指令的地址,而不是msg1_len
的位置1}}定义。