2015-12-16 2 views
1

Я пишу простую программу, которая вызывает подпрограмму и ожидает значения обратно. до сих пор у меня есть:Возвращаемое значение из подпрограммы в сборке

%include "asm_io.inc" 
SECTION .data 
SECTION .bss 
SECTION .text 
    global asm_main 
asm_main: 
enter 0,0 
pusha 
mov ebx, dword [ebp+12] 
mov eax, dword [ebx+4] 
push eax 
call maxLyn 
push eax  ; contains value 4 
call print_int 
popa 
leave 
ret 

maxLyn: 
enter 0,0 
pusha 
mov ebx, dword[ebp+12] 
mov eax, [ebx+4] 
add eax, dword 2 
push eax 
ret 

Так что, когда я запускаю код lynarr abc 2, я ожидал значение 4, которое будет отображаться. Но это не показывает никаких результатов. любые идеи были бы действительно полезны!

+0

Также вы толкаемых EAX перед тем RET. Ваш адрес возврата потерян. Не говоря уже о pusha. Когда вы вызываете подпрограмму, адрес возврата находится в верхней части стека. Вы должны держать его там. – Steven

ответ

3
  • Поскольку вы вызываете программу с «lynarr аЬс 2», чтобы получить указатель на 2-й аргумент командной строки, необходимо использовать mov ebx, dword [ebp+12]mov eax, dword [ebx+8]

  • Ваш призыв к Maxlyn имеет только один аргумент , Его можно найти в [EBP + 8]. Вы написали [EBP + 12].

  • Вы не можете использовать push перед возвратом. Использовать leave

  • Не используйте pusha здесь. Просто нажмите/поп EBX.

  • Почему вы используете print_int когда AL/EAX содержит символ "4"

Maxlyn становится:

enter 0,0 
push ebx 
mov ebx, dword [ebp+8] 
movzx eax, byte [ebx] ;Character "2" 
add eax, dword 2 
pop ebx 
leave 
ret 
+0

Я внес изменения, которые вы предложили, но я получаю сообщение об ошибке «ожидаемый унарный оператор» после запуска 'lynarr abc 2' – Sally

+1

@ Обычно ожидаемый звук унарного оператора звучит как проблема сценария оболочки. Вы запускаете свою программу из сценария bash? –

+0

@MichaelPetch да. вот полный код ошибки '-bash: lynarr: abc: unary operator expected'. – Sally

Смежные вопросы