Я новичок в NASM и пытаюсь преобразовать строку в число в NASM, но не знаю, работает ли это. Код компилируется без проблем, но всегда показывает один и тот же результат независимо от чисел.
Может ли кто-нибудь взглянуть, что не так?
string_int:
xor rbx, rbx ; result saved here
xor rax, rax
xor rcx, rcx ; counter
_loop:
mov al, byte[rsi + rcx]
cmp al, 0xA
je done
inc rcx
sub al, 0x30
mov rax, 0xA
mul rbx
add rbx, rax
jmp _loop
done:
ret
На самом деле вы хотите, чтобы imul rbx, 10
реализовал total = 10*total + digit
, я понял это задом наперед.
Вот как это сделать эффективно: Сборка NASM преобразовать ввод в целое число?
Вы уничтожаете свою ценность в AL с помощью
mov rax, 0xa
. Вы бы сами это обнаружили, если бы пошаговали с отладчиком и наблюдали за изменением регистров. Вы, наверное, имели в виду RBX. Или лучше,imul eax, 0xa
/add ebx, eax
, потому что вы не ограничены инструкциями 8086, такими как MUL или IMUL с одним операндом. (Или даже лучше, две инструкции LEA могут умножаться на 10 и складываться с меньшей задержкой, чем IMUL-немедленный.)