-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
@edit:私は-24がdecへの符号付き0xE8値の値であることを知っていますが、それを符号なしにするにはどうすればよいですか。そのバイトだけをレジスタに移動し、各数字の下位バイトの現在の合計に加算すると、実際には動作しません。232の代わりに-24が追加されます。 – Barcys
'x/8ub'で印刷してみましょう。 – fuz
BYTE値-24または232を追加することは同じことです。あなたの合計が間違っている場合は、バイト値を追加することが何を意味するのか、間違っていると思われます。 1バイトは8ビットのみを含むことができるため、整数値の場合は通常-128 .. + 127または0..255の範囲をカバーできます。より大きな合計が必要な場合は、合計に16または32ビットの値が必要です。バイト値を同じサイズに拡張する必要があります。 0xE8を "ゼロ拡張"形式で16bに拡張すると( 'movzx'が助けます、'と ')、0x00E8 = +232になります。それを "sign-extend"すると( 'movsx、sar、...')、0xFFE8 = -24になります。 – Ped7g