在汇编或程序退出值中误解ADD指令

时间:2013-07-25 16:39:17

标签: linux assembly 64-bit nasm

在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是如何工作的,或者误解了如何将退出代码返回给操作系统。我对此是否正确?

1 个答案:

答案 0 :(得分:2)

Linux上保证支持的退出代码范围为0-255(含)。保留退出状态的较高位以便传达关于程序终止的其他信息。 480超出此范围,因此实际退出代码未定义。

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