1

在 64 位 Linux 计算机上再次修改汇编语言,尽管这应该没什么区别。

我将复制我的程序并通过它进行讨论。目前我没有得到我期望的答案。开始了:

global _start

    section .data
v1 dq 151    ; first variable points to memory location containing "151d"
v2 dq 310    ; uint64_t v2 = 310d
sum dq 0

    section .text
_start:

mov rax, 9       ; rax now contains 9
add [v1], rax    ; v1 now points to a memory location containing 151 + 9 = 160

mov rax, [v2]    ; rax contains the value 310
add rax, 10      ; rax contains the value 310 + 10 = 320
add rax, [v1]    ; rax contains the value 320 + 160 = 480
mov [sum], rax   ; sum now points to a memory location containing the value 480

mov eax, 1       ; system call to "exit"=1
mov ebx, [sum]   ; return value of program is 480
int 0x080        ; call the system interrupt to terminate program

然后运行我的程序,我这样做:

./main.exec; echo $?

输出是:

224

不是480?我猜我误解了如何add工作,或者误解了如何将退出代码返回给操作系统。我对此是否正确?

4

1 回答 1

2

Linux 上保证支持的退出代码的范围是 0-255,包括 0-255。退出状态的较高位被保留,以便传达有关程序终止的其他信息。480 不在此范围内,因此实际退出代码未定义。

但是,大多数实现只会截断退出代码,这就是这里发生的情况:480 mod 256 = 224。

于 2013-07-25T16:41:55.290 回答