2017-05-23 65 views
-1

我需要AT & T組件中的一些幫助。 我已經加載一些數據到內存中像下面(十六進制和分解)AT&T組件添加字節

(gdb) x/8xb &buffer_in 
0x8049096: 0x03 0x02 0x10 0x27 0xe8 0x03 0x64 0x00 


(gdb) x/8db &buffer_in 
0x8049096: 3  2  16  39  -24  3  100  0 

比方說該第一字節=數計數,以字節爲單位秒)=(各號碼的長度,然後我們得到(第一*秒)的字節數字。在這個例子中,3個數字,每個2個字節,第一個數字是16 39,所以是1。 我沒有執行它的問題,我可以抓住每個字節並添加。

問題是,爲什麼地獄十六進制數字十六進制0xE8 = -24在剛剛加載數據到內存後(如下)? 它應該是十進制的 232。

代碼加載數據是非常簡單的:

.align 32 
SYSEXIT = 1 
SYSREAD = 3 
SYSWRITE = 4 
STDOUT = 1 
STDIN = 0 

.bss 

buffer_in: .space 10000 
buffer_in_len = . - buffer_in 

.text 
.global _start 
_start: 

    #STDIN READ 
movl $SYSREAD, %eax 
movl $STDIN, %ebx 
movl $buffer_in, %ecx 
movl $buffer_in_len, %edx 
int $0x80 


debug: 
movl $0, %edi #do nothing 

movl $SYSEXIT, %eax 
int $0x80 
+0

@edit:我知道-24是dec的有符號值0xE8的值,但我能做些什麼來使它無符號。只移動該字節來註冊並添加到每個數字的低字節總和當前並不起作用,它將添加-24而不是232 – Barcys

+0

嘗試使用'x/8ub'打印。 – fuz

+0

添加BYTE值-24或232是同樣的事情。如果你的求和是錯誤的,那麼你可能會錯誤地認爲增加字節值意味着什麼。由於單字節只能包含8位,對於整數值,通常可以覆蓋-128 .. + 127或0..255範圍。如果你想要更大的總和,你需要16或32位的總和值,然後你應該擴展字節值到相同的大小。當將0xE8以「零擴展」方式擴展到16b('movzx'可能有幫助,或者'和')時,它將變爲0x00E8 = +232。如果你要「簽名擴展」它('movsx,sar,...'),它將變成0xFFE8 = -24。 – Ped7g

回答

1

d格式說明打印其參數作爲有符號十進制數。要打印無符號十進制數,請改爲使用u。你的命令是x/8ub