从程序集中的子例程返回值

时间:2015-12-16 15:06:05

标签: assembly x86 subroutine

我正在编写一个调用子程序的简单程序并期望返回一个值。到目前为止我有:

%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。但它没有显示任何结果。任何想法都会非常有用!

1 个答案:

答案 0 :(得分:3)

  • 由于您使用“lynarr abc 2”调用程序以获取指向第二个命令行参数的指针,因此您需要使用mov ebx, dword [ebp+12] mov eax, dword [ebx+8]

  • 您对 maxLyn 的调用只有一个参数。它可以在[EBP + 8]找到。你写了[EBP + 12]。

  • 您不能在返回前使用push。使用leave

  • 请勿在此处使用pusha。只需按下/弹出EBX。

  • 当AL / EAX包含字符“4”时,为什么使用 print_int

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