Содержат ли адреса памяти неявные шестнадцатеричные цифры? - PullRequest
0 голосов
/ 31 мая 2018

Каково значение адреса памяти, который меньше 12 шестнадцатеричных цифр на 64-разрядном компьютере?

Например, когда я запускаю gdb в простой программе сборки и запускаю (gdb) info frame, я получаю:

Stack level 0, frame at 0x7fffffffd970:
 rip = 0x40052f in main (file.s:11); saved rip = 0x7ffff7a2d830
 source language asm.
 Arglist at 0x7fffffffd960, args: 
 Locals at 0x7fffffffd960, Previous frame's sp is 0x7fffffffd970
 Saved registers:
  rbp at 0x7fffffffd960, rip at 0x7fffffffd968

Первая часть второй строки rip = 0x40052f in main (file.s:11) Я считаю, что указывается значение указателя инструкции при вызове info frame.Но почему адрес памяти не содержит 12 шестнадцатеричных цифр?

Кроме того, если я наберу (gdb) x 0x7fffffffd968 (который я ожидаю равным 0x7ffff7a2d830), я получу:

0x7fffffffd968: 0xf7a2d830

это означает, что любой адрес памяти, содержащий менее 12 шестнадцатеричных цифр, содержит неявный 7ff...?

1 Ответ

0 голосов
/ 01 июня 2018

Нет.В x86 или x86_64 адрес памяти - это просто число, но обычно он отображается в шестнадцатеричном формате.И, как и в большинстве систем обозначений чисел, более короткое число означает гораздо меньшее значение, или, если хотите, перед ним есть неявные нули.

Так же, как десятичная строка «12» намного меньше, чем «12654321»", адрес 0x40052f намного меньше адреса 0x7ffff7a2d830.Два адреса почти наверняка находятся в разных картах виртуальной памяти.(В Linux вы можете просматривать карты виртуальной памяти по cat /proc/{pid}/maps.)

Когда вы использовали команду gdb x, вы не увидели ожидаемого значения, потому что gdb угадал, какого родаданные ваш адрес указывает на.При первом использовании x в сеансе GDB он по умолчанию показывает 4 байта (32 бита) на элемент, как если бы адрес указывал на массив uint32_t.Поскольку адреса в x86_64 имеют размер 8 байт (64 бита), вам нужно x/g, чтобы сообщить gdb, что размер элемента составляет 8 байт.

...