2017-05-23 19 views
-1

私はAT & Tアセンブリでいくつかの助けが必要です。 私は(16進数と12月)(最初の*秒)のバイトを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です。 私はそれを実装する上で問題はなく、私は各バイトをつかんで追加することができます。

質問はで、なぜデータをメモリにロードした後に10進数で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値の値であることを知っていますが、それを符号なしにするにはどうすればよいですか。そのバイトだけをレジスタに移動し、各数字の下位バイトの現在の合計に加算すると、実際には動作しません。232の代わりに-24が追加されます。 – Barcys

+0

'x/8ub'で印刷してみましょう。 – fuz

+0

BYTE値-24または232を追加することは同じことです。あなたの合計が間違っている場合は、バイト値を追加することが何を意味するのか、間違っていると思われます。 1バイトは8ビットのみを含むことができるため、整数値の場合は通常-128 .. + 127または0..255の範囲をカバーできます。より大きな合計が必要な場合は、合計に16または32ビットの値が必要です。バイト値を同じサイズに拡張する必要があります。 0xE8を "ゼロ拡張"形式で16bに拡張すると( 'movzx'が助けます、'と ')、0x00E8 = +232になります。それを "sign-extend"すると( 'movsx、sar、...')、0xFFE8 = -24になります。 – Ped7g

答えて

1

d形式指定子は、符号付き10進数としての引数を表示します。符号なし10進数を印刷するには、代わりにuを使用します。あなたのコマンドはx/8ubです。

関連する問題