Почему не заполнить нулями
Выделенный массив на 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