错误的" len"

时间:2017-10-17 05:53:21

标签: linux assembly x86 64-bit fasm

我有这个FASM代码:

  msg1:
      db "hello", 0

  msg1_len equ $ - msg1; should be 6

尽管msg1_len应该是6,但是当我调试它时,它会返回一个奇怪的大数字,例如4570.也就是说," msg1_len"等于4570

在其他应用程序中它是相同的 - 一个大的,随机的数字而不是字符串的长度。

这是为什么?如何解决?

1 个答案:

答案 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文档:

  

=指令允许定义数值常量。它应该以常量的名称开头,后跟提供值的数值表达式。这些常量的值可以是数字或地址,但是 - 与标签不同 - 数字常量不允许保存基于寄存器的地址。除了这种差异之外,在它们的基本变体中,数字常量的行为与标签非常相似,甚至可以向前引用它们(在实际定义之前访问它们的值)。

vs 2.3.2 Symbolic constants

  

符号常量与数值常量不同,在汇编过程之前,它们在定义后的源行中的每个值都被替换,任何东西都可以成为它们的值。

     

符号常量的定义由常量的名称后跟equ指令组成。遵循此指令的所有内容都将成为常量的值。如果符号常量的值包含其他符号常量,则在将此值赋给新常量之前,它们将替换为它们的值。

结论:所以你应该使用=代替equ(在FASM中)。

(用于计算数字常量,我的意思是..你仍然可以使用equ作为符号常量......对我来说就像宏定义一样)

你得到了很大的常数,因为你在代码之前定义了这个符号,并且在编译期间它做了mov edx,$ - msg1之类的事情,其中​​$已经是指令的地址,而不是msg1_len的位置1}}定义。