Неправильный размер "Лен"

У меня есть этот код FASM:

  msg1:
      db "hello", 0

  msg1_len equ $ - msg1; should be 6

Хотя msg1_len должен быть равен 6, при отладке он возвращает странное большое число, такое как 4570. То есть msg1_len равно 4570

В других приложениях это то же самое - большое, случайное число вместо длины строки.

Почему это? Как это исправить?

1 ответ

РЕДАКТИРОВАТЬ: Ooops.... Я использовал =не equ,

Когда я заменил = с equЯ получаю ошибку компиляции:

helloworld.asm [13]:
        mov     edx,msg1_size      ; Length  of message
error: undefined symbol 'msg1_size'.

(версия для плоского ассемблера 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

окончательное (?) обновление:

Проверьте FASM документы о 2.2.1 Числовые константы:

= Директива позволяет определить числовую константу. Ему должно предшествовать имя константы, а затем числовое выражение, предоставляющее значение. Значением таких констант может быть число или адрес, но, в отличие от меток, числовые константы не могут содержать адреса на основе регистров. Помимо этого различия, в их базовом варианте числовые константы ведут себя очень похоже на метки, и вы даже можете ссылаться на них вперед (получить доступ к их значениям до того, как они действительно будут определены).

2.3.2 Символические константы:

Символические константы отличаются от числовых констант: перед процессом сборки они заменяются своими значениями везде в строках исходного текста после их определений, и все может стать их значениями.

Определение символической константы состоит из имени константы, за которым следует equ директивы. Все, что следует этой директиве, станет значением константы. Если значение символической константы содержит другие символические константы, они заменяются их значениями перед присвоением этого значения новой константе.

Вывод: так что вы должны использовать = вместо equ (в FASM).

(для вычисления числовых констант я имею в виду.. вы все еще можете использовать equ для символических констант... звучит для меня как макроопределение)

Вы получили свою большую константу, потому что этот символ был определен перед кодом, и во время компиляции он сделал что-то вроде mov edx,$ - msg1, где $ это уже адрес инструкции, а не ваше размещение msg1_len определение.

Другие вопросы по тегам