2013-07-25 65 views
1

在64位Linux計算機上再次使用匯編語言修改,儘管這應該沒有什麼區別。程序集或程序退出值ADD指令的誤解

我會複製我的程序,並通過它講我的方式。目前我沒有得到我期望的答案。在這裏,我們去:

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

建議:HTTP://www.csee.umbc通過與GDB代碼的一步。 EDU /〜cpatel2 /鏈接/ 310/NASM/gdb_help.shtml。我想你會看到你的代碼工作正常......但480> 256.和480-256 = 224 :) – paulsm4

+0

@ paulsm4可能應該學習gdb! – user3728501

回答

2

Linux上保證可支持退出代碼的範圍是0-255(含)。保留退出狀態的較高位以便傳送關於程序終止的其他信息。 480超出此範圍,所以實際的退出代碼是不確定的。

然而,大多數實現將簡單地截斷退出代碼,這是這裏發生了什麼:480 MOD 256 = 224

+0

啊謝謝,大概應該預見到了! – user3728501