0

10000 ビットに割り当てられた配列 = 1250 バイト (10000/8):

mov edi, 1250
call malloc

ポインタをテストしました:

cmp rax, 0
jz .error ; error handling at label down the code

メモリが割り当てられました:

(gdb) p/x $rax
$3 = 0x6030c0

その割り当てられたメモリをゼロで埋めようとしました:

mov rdi, rax
xor esi, esi
mov edx, 1250 ; 10000 bits
call memset

チェックされた最初のバイト:

(gdb) p/x $rax
$2 = 0x6030c0
(gdb) x/xg $rax + 0
0x6030c0: 0x0000000000000000

チェックされた最後のバイト (0 - 最初のバイト、1249 - 最後のバイト)

(gdb) p/x $rax + 1249
$3 = 0x6035a1
(gdb) x/xg $rax + 1249
0x6035a1: 0x6100000000000000

解決した質問 入力する必要がありましたx/1c $rax + 1249

4

1 に答える 1

2

メモリを 64 ビット整数として解釈しましたが、Intel のエンディアンがリトル エンディアンであることを忘れていました。そのため、バイトが逆になりました。

0x6100000000000000このアドレスでメモリを逆シリアル化するときに CPU が読み取る値です。リトル エンディアンであるため、0x61バイトはメモリの最後にあります (ビッグ エンディアン アーキテクチャでない限り、この形式でメモリをダンプするのはあまり便利ではありません)。

使用x /10bx $rax + 1249すると、正しい場所でゼロであることがわかります。残りはガベージです(たまたましばらくゼロになり、その後ガベージ)

0x00    0x00    0x00    0x00    0x00    0x00    0x61
于 2016-09-11T08:41:31.140 に答える