Swego czasu napisałem "funkcję" atoi__ do tego typu ćwiczeń (konwersja z typu "char" na "int"). Piszę w cudzysłowie, ponieważ język assembly x86-64 operuje na pamięci prawie, że bezpośrednio, wiec trudno odróżniać tam typy.
global _main
extern _printf
extern _exit
section .data
fmt_u: db "%u", 0
fmt_s: db "%s", 0
str_s: db "200", 0
str_s2: db "20525", 0
section .text
_main:
mov ebx, str_s2
lea eax, [ebx+1]
call atoi__
add eax, 475
push eax
push fmt_u
call _printf
add esp, 8
push 0
call _exit
add esp, 4
ret
atoi__:
mov ecx, -1
xor esi, esi
call len_of_n
dec edi
h1:
inc ecx
mov dl, byte [eax+ecx-1]
mov ebx, edx
sub ebx, 0x30
;; (8*10)+3
; mov esi, ebx
cmp ecx, 1
jge hhh
hhh2:
push eax
push edi
mov eax, 10
mul ebx
mov ebx, eax
mov esi, ebx
pop edi
pop eax
; hhh2:
cmp ecx, edi
jne h1
xor edx, edx
mov eax, ebx
mov ebx, 10
div ebx
ret
hhh:
add ebx, esi
mov esi, ebx
jmp hhh2
ret
len_of_n:
mov edi, -1
loop_x:
inc edi
cmp byte [eax-1+edi], 0x00
jne loop_x
ret
section .bss
Kompilacja: nasm -fwin32 atoi1.asm && gcc atoi1.obj -o atoi1.exe && atoi1.exe
Nie testowałem tego kodu za bardzo. Wydaje się być w miarę poprawnym. Powinien działać i spełniać założenia. Ale jak mówię należałoby przetestować i sprawdzić, czy wszystko z programem jest w porządku.