无法确定汇编语言中的 return 值

Having trouble determining the return value in assembly language

我是汇编世界的新手language/code。我觉得很难理解,但我尽力了。我只是遇到了作业需要回答的一些问题。

  1. 我需要找出特定程序的 return 值,如果我通过 echo $?作为终端中的命令,我得到 10 作为答案。然而我老师的回答 sheet 说答案是 9.

  2. 我需要通过检查汇编代码的转储来找出(同一程序的)main 的 return 值。同样,我认为答案是 10,因为 0xa = 10。但是,答案 sheet 再次表示答案是 9。默认情况下我是否需要从 return 值中减去 1?如果是,为什么?

    0x000000000000069f <+0>:     55               push    %rbp
    0x00000000000006a0 <+1>:     48 89 e5         mov    %rsp,%rbp
    0x00000000000006a3 <+4>:     bf 05 00 00 00   mov    [=11=]x5,%edi
    0x00000000000006a8 <+9>:     e8 9d ff ff ff   callq  0x64a <okfisbup>
    0x00000000000006ad <+14>:    b8 0a 00 00 00   mov    [=11=]xa,%eax
    0x00000000000006b2 <+19>:    5d               pop   %rbp
    0x00000000000006b3 <+20>:    c3               retq   
    

当我运行程序时,通过使用./(文件名),这就是我得到的。

 iteratie: 1, buffer address  : 0x7ffe4052d0e0
 iteratie: 2, buffer address  : 0x7ffe4052d1c0
 iteratie: 3, buffer address  : 0x7ffe4052d2a0
 iteratie: 4, buffer address  : 0x7ffe4052d380
 iteratie: 5, buffer address  : 0x7ffe4052d460

这是 okfisbup 的转储:

   0x000000000000064a <+0>:     push   %rbp
   0x000000000000064b <+1>:     mov    %rsp,%rbp
   0x000000000000064e <+4>:     sub    [=13=]xd0,%rsp
   0x0000000000000655 <+11>:    mov    %edi,%eax
   0x0000000000000657 <+13>:    mov    %al,-0xc4(%rbp)
   0x000000000000065d <+19>:    movzbl -0xc4(%rbp),%eax
   0x0000000000000664 <+26>:    sub    [=13=]x1,%eax
   0x0000000000000667 <+29>:    mov    %al,-0x1(%rbp)
   0x000000000000066a <+32>:    cmpb   [=13=]x0,-0x1(%rbp)
   0x000000000000066e <+36>:    je     0x67b <okfisbup+49>
   0x0000000000000670 <+38>:    movzbl -0x1(%rbp),%eax
   0x0000000000000674 <+42>:    mov    %eax,%edi
   0x0000000000000676 <+44>:    callq  0x64a <okfisbup>
   0x000000000000067b <+49>:    movzbl -0xc4(%rbp),%eax
   0x0000000000000682 <+56>:    lea    -0xc0(%rbp),%rdx
   0x0000000000000689 <+63>:    mov    %eax,%esi
   0x000000000000068b <+65>:    lea    0xb6(%rip),%rdi        # 0x748
   0x0000000000000692 <+72>:    mov    [=13=]x0,%eax
   0x0000000000000697 <+77>:    callq  0x520 <printf@plt>
   0x000000000000069c <+82>:    nop
   0x000000000000069d <+83>:    leaveq 
   0x000000000000069e <+84>:    retq
    movq [=10=]xa, %eax
    popq rbp
    retq

return 值为 10。答案sheet是错误的。

如果没有给出代码并使用 $? 进行测试,假设存在隐藏的退出调用是不公平的。显示 10. 够了.

编辑:okfisbup 的反汇编现已发布。它只调用自己和 printf.

return 值是 10,你的老师错了

https://godbolt.org/z/8YsnvPahM

int main(void)
{
    return 10;
}

main:
        pushq   %rbp
        movq    %rsp, %rbp
        movl    , %eax
        popq    %rbp
        ret