Вы Уважаемые под Колобков и Колобих не прикидывайтесь.... пожалуйста --- Сообщение объединено, 1 июл 2021 --- Будет и другой вопрос: Как слинковать .obj с помощью gcc и т.п. на win64 используя динамические библиотеки user32 & kernel32 --- Сообщение объединено, 1 июл 2021 --- Mikl___ KCAHDEP три X - это не ты случайно?
Вы уважаемый вопрос конкретнее пишите, ответ вам нужен как бы. И никто не должен угадывать с полуслова, что вы там себе задумали. также, наверное, как и на х86. Или что именно не получается? Попробуйте сформулировать вопрос более коректно - что делал, как делал, что не вышло, какая ошибка..
Hacker, Вызов обычный процедурный или может быть вопрос про режим совместимости, те как вызвать 64 из под 86 - wow. Это популярная тема, режим гадания включить ? Если не хочешь норм сформулировать вопрос, то и ответ тебе не дадут. А есчо тебя маркернут негласно как какого то троля/муд-ка етк и больше тебе что то спрашивать смысла не будет.
M0rg0t, В ABI x64 регистры RBX, RBP, RDI, RSI, RSP, R12-15 и XMM6–15 должны быть сохранены и восстановлены с помощью функции, которая их использует. Целочисленные аргументы передаются в регистрах RCX, RDX, R8-9. Аргументы с плавающей запятой передаются в XMM0-3 Результат возвращается в регистрах RAX, R10-11, XMM4-5 https://docs.microsoft.com/ru-ru/cpp/build/x64-calling-convention?view=msvc-170
rmn, да, точно, RBX. Mikl___, спасибо. про R12-15 не знал. Еще такой момент. Видел где-то в сорцах код вида Код (Text): enter 80h,0 sub rsp,90h я помню, что в х64 нужно создавать стековый фрейм и туда дублировать аргументы процедуры (тут обсуждалось), но зачем код это делает дважды ? Ведь enter == sub rsp, или что-то путаю?
Дублировать аргументы не нужно. Надо просто выделить место под четыре регистра, через которые передаются параметры, чтобы функция в прологе могла их туда сохранить и использовать для чего-нибудь другого.
Не для чего-нибудь, а тупо под аргументы для первого же вызова внутри процедуры. О - Оптимизация или Отложенное помещение аргументов в стек.
Чувствую себя опять начинающим с 64 битным ассемблером. Появились еще вопросы: 1. Работает ли стек также, как и раньше? Ну т.е. могу ли я сохранить там что-то через push и потом восстановить через pop, или какие-то винапи могут испортить стек? Вроде бред, но наблюдаю такое поведение. 2. опять же стек, пишу процедуру вида Код (Text): lookup_api proc uses rdi rsi rbx sub rsp, 28h оно трансформируется в Код (ASM): lookup_api proc push rsi push rdi push rbx sub rsp, 28h и потом эти регистры "теряются". Наверное, сначала надо выделить память на стеке а потом передавать эти регистры? Но почему сам масм так делает, на 32 бит же норм было. и нужно ли тогда выделять больше, чем 28h, если я туда еще пишу эти регистры?
M0rg0t, для временной переменной лучше (проще) создать локальную переменную в памяти. Через стек сохраняйте что-то там через push и потом восстанавливайте через pop если между push и pop нет винапи. Кроме того, перед вызовом системной процедуры значение rsp должно быть быть кратно 16, а push/pop сдвигают значение в rsp на 8