Witam,
Mam problem z napisaniem procedury wykonującej: scanf("%d", EAX). Oczywiście w języku C zamiast EAX podaje się adres zmiennej w pamięci.
Wstępnie napisałem taki kod:
;
; read_int: scanf("%d", EAX)
;
read_c_int: push ebp ; set up stack frame
mov ebp, esp
push eax
push dword str_int
call scanf ; call C
add esp, 4
pop eax
mov esp, ebp ; takedown stack frame
pop ebp
ret ; return to previous block
Oczywiście nie działa.
Natomiast taka procedurka już sobie radzi, ale używa dodatkowej zmiennej:
;
; read_int: scanf("%d", EAX)
;
read_c_int:
push ebp ; set up stack frame
mov ebp, esp
push a
push dword str_int
call scanf ; scanf("%d", &a)
add esp, 8
mov eax, [a]
mov esp, ebp ; takedown stack frame
pop ebp
ret ; return to previous block
Niestety, rozwiązanie to ma jedną wadę - używa zmiennej globalnej zadeklarowanej w sekcji .bss. Idealnie jakbym mógł użyć w tym celu zmiennej lokalnej (czy to jest możliwe?) albo bezpośrednio pisać do zawartości rejestru.
Jaki jest najlepszy sposób na rozwiązanie tego problemu typowy dla NASM?
Pozdrawiam,