Помогите перевести код с fasm на nasm
Мне нужно вывести текущее время в терминал пишу код на nasm. Для перевода числа в строку решил использовать этот код.
Он написан на fasm и оформлен в отдельную процидуру. Я же хочу использовать его в теле моей программмы. Мне непонятна пара моментов:
Что такое @@ и @b в том коде? В остальном же, мне кажется, я понял суть прогрммы и написал правильный код:
section .bss
buf resb 250
section .text
global _start
gettime:
mov eax, 13
xor ebx, ebx
int 0x80
mov [time], eax ; время в секундах, перевести в строку для вывода
; перевод
xor ecx, ecx ; 0 в счетчик
xor edx, edx ; 0
mov ebx, 10 ; делитель системы счисления
mov esi, [time]
mov edi, [esi+4] ; старший dword
mov esi, [esi+0] ; младший dword
test edi, edi ; меняем флаги
jz lowdword
hightdword:
; делим старший dword
mov eax, edi
div ebx
mov edi, eax
; остаток от деления в edx
lowdword:
; делим остаток от деления и младший dword
mov eax, esi
div ebx
add edx, '0'
push edx ; код символа в стек
inc ecx
mov esi, eax
xor edx, edx
test edi, edi ; Старшая часть не равна нулю
jnz hightdword
test eax, eax ; Младшая часть не равна нулю
jnz lowdword
mov edi, [buf]
; Дальше идёт метка @@
; теперь строка на вывод
mov eax, 4
mov ebx, 1
mov ecx, buf
mov edx, 8
int 0x80
Чем можно заменить @b и что это за команда?
Ответы (1 шт):
@@ - это анонимные метки. Переход на @b или @r - это переход на ближайшую предыдущую метку @@, переход на @f - на ближайшую следующую (документация). Это не специфично именно для fasm, такой вариант меток есть и в masm, например.
Можно заменить на обычные метки:
; Считываем символы из стека в буфер
mov edi, [buf]
loop_start:
pop edx
mov [edi], edx
inc edi
dec ecx
jnz loop_start
Не знаю зачем вы в коде заменили локальные метки (с точкой в начале) на обычные - такие метки в nasm поддерживаются (см. тут например: Локальные метки)