在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
是如何工作的,或者误解了如何将退出代码返回给操作系统。我对此是否正确?
答案 0 :(得分:2)
Linux上保证支持的退出代码范围为0-255(含)。保留退出状态的较高位以便传达关于程序终止的其他信息。 480超出此范围,因此实际退出代码未定义。
但是,大多数实现只会截断退出代码,这就是这里发生的事情:480 mod 256 = 224。