Какие числовые значения определяют в коде Си-кода?
Я понимаю сборку и код 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
,