Почему не заполнить нулями

Выделенный массив на 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

1 ответ

Решение

Вы интерпретировали память как 64-битное целое число, но вы забыли, что порядковый номер Intel - это не порядковый номер. Таким образом, байты были полностью изменены.

0x6100000000000000 это значение, которое ЦП читает при десериализации памяти по этому адресу. Так как он немного порядковый, 0x61 Байт является последним в памяти (не очень удобно делать дамп памяти в этом формате, если у вас нет архитектуры с прямым порядком байтов)

использование x /10bx $rax + 1249 вы увидите, что это ноль в правильном месте. Остальное мусор (какое-то время бывает ноль, потом мусор)

0x00    0x00    0x00    0x00    0x00    0x00    0x61
Другие вопросы по тегам