Проблема с передачей параметров в стеке в NASM - PullRequest
0 голосов
/ 29 января 2011

Я пытаюсь написать функцию для преобразования целого числа, помещенного в стек, в коды ASCII. Преобразование работает нормально, но у меня проблема с параметром, который передается в стек.

org 100h 

section .text 

start: 

mov eax, 12345
push eax

call print_int
add esp, 4      ;clear the stack

jmp _exit

;value is in the stack
print_int:

push ebp
mov ebp, esp

mov ecx, 0Ah        ;divide by 10
mov eax, [ebp+8]    ;value is in ebp + 8

again1:

mov edx, 0
idiv ecx       ;quotent in EAX, remainder in EDX

push edx

cmp eax, 0
jne again1


printing:

;output a digit
pop edx     ;get digit from stack

add dl, 30h ;convert to ASCII
mov ah, 02h
int 21h     ; print


cmp esp, ebp
jne printing


mov esp, ebp
pop ebp
ret

_exit:
mov al, 0
mov ah, 4ch
int 21h

section .data 
section .bss 

Проблема в том, что mov eax, [ebp + 8] устанавливает eax на 0 вместо 12345. Если я изменю mov eax, [ebp + 8] на mov eax, 12345, все в порядке.

1 Ответ

1 голос
/ 30 января 2011

Если вы запускаете эту программу в режиме 16-битного процессора, то уровень стека push / pop составляет 2 байта, а не 4. Таким образом, ваша калибровка стека неправильна!И вы используете неправильную директиву nasm, потому что вы используете 32-битные регистры вместо 16-битных.

...