169 похожих чатов

Просто я так понимаю, что большинство функций я вызываю stdcall,

а сишные функции почему-то cdecl , эти функции ч должен отчищать

А как я пойму какое соглашения я вызвал, если моя инструкция
Push str
Call [printf]?

26 ответов

29 просмотров

Если так, то твое соглашение либо pascal, либо stdcall

Alexey- Автор вопроса
The Bird of Hermes
Если так, то твое соглашение либо pascal, либо std...

Как так, я в одних функциях отчищаю стек, в других нет - хотя везде пишу call

Alexey
Как так, я в одних функциях отчищаю стек, в других...

Разные соглашения о вызовах. Где-то ты будешь через регистры передавать аргументы - fastcall или thiscall

Alexey- Автор вопроса
The Bird of Hermes
Разные соглашения о вызовах. Где-то ты будешь чере...

Там в макросах у Томаша много неоптимизированных моментов, потому что Томаш пишет от души, и вообще он старичок, целых 20 лет один и тот же проект полностью чисто на ассемблере пишет, так что его надо уважать.

Alexey- Автор вопроса
The Bird of Hermes
Разные соглашения о вызовах. Где-то ты будешь чере...

Ну хорошо а если я положу аргументы в регистры и напишу call, то случится конец света?

Alexey
Фаст наверное, thiscall я вообще не знаю

fastcall - на х86_32 будет передача через eax, ecx, edx. thiscall - первый аргумент - указатель на экземпляр, передаётся в ecx

Alexey
Ну хорошо а если я положу аргументы в регистры и н...

Тут зависит от функции. Если не ты писал функцию, то ты не можешь определять соглашение о вызовах

КТ315
Там в макросах у Томаша много неоптимизированных м...

virtual origin = $ mov rax,param load opcode byte from origin+1 end virtual if opcode = 0B8h mov rax,param mov [rsp+(counter-1)*8],rax else mov qword [rsp+(counter-1)*8],param end if А еще меня заинтересовала эта штука

The Bird of Hermes
virtual origin = $ mov rax,par...

FASM может читать свой же код.

КТ315
FASM может читать свой же код.

Да я в курсе, но что именно он тут отлавливает?

Alexey- Автор вопроса
The Bird of Hermes
Надо полазать и заоптимизировать)

а я хочу в fasmw полазить, так и манит код посмотреть

The Bird of Hermes
Да я в курсе, но что именно он тут отлавливает?

Я понял. Опкод B8 это когда значение слишком большое. И в mov qword[], значение - оно не влезет, поэтому умный Томаш определил опкод, и если FASM сгенерировал B8, тогда он сначала пихает в регистр, а из регистра в память, а если значение маленькое (меньше 64 бит), тогда просто пихает сразу напрямую.

КТ315
Я понял. Опкод B8 это когда значение слишком больш...

Своеобразный самомодифицирующийся код, к слову.

КТ315
Своеобразный самомодифицирующийся код, к слову.

Не, это условная генерация кода. Хотя он мог бы так не извращаться и сразу, если это число, проверить, что оно больше чем 32 бита. По сути тут нет именно модификации кода, так как тот опкод, который он читает, находится в виртуальном пространстве и не проецируется на реальную память

КТ315
Томаш так решил, значит надо.

Он сам делает так, как я сказал, в инициализции локальных переменных)

КТ315
Ничего не понял.

Ну в макросе local/locals. Там он если надо загрузить данные из области в 8 байт при условии что значение там больше 4 байт загружает по очереди по 4 байта

The Bird of Hermes
Ну в макросе local/locals. Там он если надо загруз...

Ну, значит код старый просто, и он не успел переписать этот участок. Это в старой какой-то версии может нельзя было так проверять. Не знаю.

КТ315
Ничего не понял.

Зато я только что понял как мне сделать то, что я хочу - макрос jret)

КТ315
Ну, значит код старый просто, и он не успел перепи...

И теперь я наконец смогу ещё больше автоматизировать даже ручные штуки вроде закрытия функции джампом на другую)

The Bird of Hermes
Не, это условная генерация кода. Хотя он мог бы та...

Я не знаю, почему конкретно тут опкод читается, но в целом Томаш это делает, потому что не все значения — просто n-битные числа. Есть отрицательные числа, которые можно компактнее кодировать с расширением знака, всякие поправки, всякие относительные метки, поэтому чем разбирать это вручную в каждом макросе, проще заставить ассемблер разбираться, у него под это есть логика, и он сделает это лучше тебя.

Похожие вопросы

Обсуждают сегодня

Какой-то там пердун в 90-х решил, что есть какая-то разная типизация. Кого вообще это волнует?
КТ315
49
void terminal_scroll() { memmove(terminal_buffer, terminal_buffer + VGA_WIDTH, buffer_size - VGA_WIDTH); memset(terminal_buffer + buffer_size - VGA_WIDTH, 0, VGA_WIDTH); ...
Егор
47
Всем привет! Подскажите, пожалуйста, в чем ошибка? Настраиваю подключение к MySQL. Либы лежат рядом с exe. Все как по "учебнику"
Евгений
16
А можете как-то проверить меня по знаниям по ассемблеру?
A A
132
Здравствуйте! У меня появилась возможность купить книгу "Изучай Haskell во имя добра!". Но я где-то слышал, что эта книга устарела. Насколько это правда??
E
22
Здравствуйте! Я вот на stepic решаю задачи на хаскеле https://stepik.org/lesson/8443/step/8?unit=1578 мой код import Data.List (isInfixOf) removing :: String -> [String] ->...
E
10
Камрады, кто тесно работал с vtv, хотел уточнить. Ширина column задаётся жёстко на этапе создания дерева или можно в рантайме ее менять программно (не мышкой)?
Ed Doc
10
да ладно ... что там неочевидного ? глянуть в исх-ки датасета и/или кверика чтобы понять в каком месте и как выполняется обращения к св-вам blablaSQL - минутное дело, даже е...
Сергей
7
Здесь для arm кто-нибудь кодит ?
Nothing
52
Всем привет, у меня есть сервер принимающий входящие HTTP подключения, как проверить, что подключение было через прокси или нет, есть какие то поля в заголовках по которым мо...
DS
8
Карта сайта