无法确定汇编语言中的 return 值
Having trouble determining the return value in assembly language
我是汇编世界的新手language/code。我觉得很难理解,但我尽力了。我只是遇到了作业需要回答的一些问题。
我需要找出特定程序的 return 值,如果我通过 echo $?作为终端中的命令,我得到 10 作为答案。然而我老师的回答 sheet 说答案是 9.
我需要通过检查汇编代码的转储来找出(同一程序的)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
我是汇编世界的新手language/code。我觉得很难理解,但我尽力了。我只是遇到了作业需要回答的一些问题。
我需要找出特定程序的 return 值,如果我通过 echo $?作为终端中的命令,我得到 10 作为答案。然而我老师的回答 sheet 说答案是 9.
我需要通过检查汇编代码的转储来找出(同一程序的)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