Какие числовые значения определяют в коде Си-кода?

Я понимаю сборку и код C. У меня есть следующая программа C, скомпилированная для генерации только объектного файла.

#include <stdio.h>
int main()
{
  int i = 10;
  int j = 22 + i;
  return 0;
}

Я выполнил следующую команду

objdump -S myprogram.o

Вывод вышеуказанной команды:

objdump -S testelf.o 

testelf.o:     file format elf32-i386


Disassembly of section .text:

00000000 <main>:
#include <stdio.h>

int main()
{
   0:   55                      push   %ebp
   1:   89 e5                   mov    %esp,%ebp
   3:   83 ec 10                sub    $0x10,%esp
  int i = 10;
   6:   c7 45 f8 0a 00 00 00    movl   $0xa,-0x8(%ebp)
  int j = 22 + i;
   d:   8b 45 f8                mov    -0x8(%ebp),%eax
  10:   83 c0 16                add    $0x16,%eax
  13:   89 45 fc                mov    %eax,-0x4(%ebp)

  return 0;
  16:   b8 00 00 00 00          mov    $0x0,%eax
}
  1b:   c9                      leave  
  1c:   c3                      ret  

Что подразумевается под числовым числом перед мнемоническими командами, например, "83 ec 10 " перед командой "sub" или "c7 45 f8 0a 00 00 00" перед командой "movl"

Я использую следующую платформу для компиляции этого кода:

$ lscpu 
Architecture:          i686
CPU op-mode(s):        32-bit
Byte Order:            Little Endian
CPU(s):                1
On-line CPU(s) list:   0
Thread(s) per core:    1
Core(s) per socket:    1
Socket(s):             1
Vendor ID:             GenuineIntel

1 ответ

Это коды операций x86. Подробная ссылка, кроме перечисленных в комментариях выше, доступна здесь.

Например, c7 45 f8 0a 00 00 00 перед movl $0xa,-0x8(%ebp) шестнадцатеричные значения для байтов кода операции Они просят ЦП переместить непосредственное значение 10 десятичных разрядов (как 4-байтовое значение) в адрес, расположенный в текущем стеке на 8 байтов выше базового указателя кадра стека. Вот где переменная i из вашего C исходный код находится, когда ваш код работает. Верхняя часть стека находится по адресу с меньшей памятью, чем нижняя часть стека, поэтому перемещение в отрицательном направлении от основания приводит к увеличению стека.

c7 45 f8 коды операций означают перемещение данных и очистку арифметического флага переноса в регистре EFLAGS. Смотрите ссылку для более подробной информации.

Остальные коды имеют непосредственное значение. Поскольку вы используете систему с прямым порядком байтов, наименее значимый байт числа указан первым, так что десятичное число 10, равное 0x0a в шестнадцатеричном формате и имеющее 4-байтовое значение 0x0000000a, сохраняется как 0a 00 00 00,

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