【问题标题】:Return value from a subroutine in assembly从汇编中的子程序返回值
【发布时间】:2015-12-16 15:06:04
【问题描述】:

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

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

【问题讨论】:

  • 你在 ret 之前推了 Eax。您的退货地址丢失了。更不用说普沙了。调用子程序时,返回地址在栈顶。你需要把它放在那里。

标签: assembly x86 subroutine


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

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

  • 您不能在返回之前使用推送。使用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

【讨论】:

  • 我按照您的建议进行了更改,但在运行 lynarr abc 2 后出现“预期一元运算符”错误
  • @Sally 一元运算符预期听起来像一个 shell 脚本问题。您是从 bash 脚本运行程序吗?
  • @MichaelPetch 是的。这是完整的错误代码-bash: lynarr: abc: unary operator expected
  • @Sally 这不是你的 C 程序中的问题,而是你的 shell 脚本中的问题,所以这与这个问题完全不同。
  • @MichaelPetch 我对此了解不多,也许你是对的。这就是我正在做的事情:我有一个文件 lynarr.asm,我正在使用 nasm -f elf32 lynarr.asm nasm -f elf32 -d ELF_TYPE asm_io.asm gcc -m32 -o lynarr lynarr.o driver.c asm_io.o 进行编译
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多