Если это 32-битная программа, почему в названии функции нет символа подчеркивания (_
)?
Потому что это не Windows.
Системы Linux / ELF не используют ведущий _
в любом режиме, независимо от архитектуры процессора.
Почему мы не можем просто написать следующее ?: move eax, DWORD [esp+8]
Можно. (Если вы правильно написали mov
) . Фактически, компиляторы по умолчанию используют -fomit-frame-pointer
, когда включена оптимизация, поэтому они используют только EBP в качестве указателя кадра в функциях с массивами C99 переменной длины или alloca
.
32 и 64-битный режим позволяют ESP быть базовым адресом для режимов адресации, в отличие от 16-битного режима, где [sp+2]
был не кодируемым.
Но помните, что если вы не нажали ebp
, ESP по-прежнему указывает на обратный адрес, поэтому первый аргумент будет в [esp+4]
.
И зачем нам здесь приведение типов?
Вы нет. Операнд регистра подразумевает размер операнда.
(И это на самом деле не приведение типов, а просто спецификатор размера операнда. Он не будет выполнять преобразование с плавающей точкой в int; вам придется использовать cvtss2si eax, [esp+4]
для этого.)
Вам нужно только нужен спецификатор размера операнда для mem, немедленные инструкции, такие как cmp dword [esp+4], 0
, которые будут неоднозначными между размером операнда байта / слова / слова. Или для инструкций типа movzx eax, byte [esp+4]
, где операнд регистра не не подразумевает размер для операнда памяти.