The Bird of Hermes
И в функции от него отталкиваться
The Bird of Hermes
Или в самом вызове функции делать шаг на 4 байта назад
The Bird of Hermes
Тогда можно вытаскивать входные параметры
The Bird of Hermes
Что-то типо
The Bird of Hermes
test proc far push ebp mov bp, sp add bp, 8 mov in, [bp]
Aiwan \ (•◡•) / _bot
proc это директива, используй просто test:
Aiwan \ (•◡•) / _bot
The Bird of Hermes
и что такое in?
Ну входной параметр
The Bird of Hermes
Переменная
Aiwan \ (•◡•) / _bot
Ну входной параметр
ну он же в стеке. так адресуйся к нему так как это по стандарту делается
Aiwan \ (•◡•) / _bot
ну вот, смещением относительно bp и происходит работа с параметрами (входными выходными)
The Bird of Hermes
ну вот, смещением относительно bp и происходит работа с параметрами (входными выходными)
Вот только как я читал, при использовании arg в стек кладётся и bp тоже
Aiwan \ (•◡•) / _bot
что за arg?
Aiwan \ (•◡•) / _bot
а, так эт чтото похожее на прототип. ну тогда все логично. согласно стандарту к параметрам обращение идет через bp
The Bird of Hermes
Как я читал описание, сначала в стеке идут arg, затем bp, затем local
Aiwan \ (•◡•) / _bot
Ну. Если я значение bp в стеке затру, то плохо будет, скорее всего
ну если ты строишь свой велосипед и используешь сторонние стандарты в купе со своим, то да, будет что то нехорошее. либо пиши все по стандарту, либо изобретай свой стандарт и не используй стандартные механизмы (директивы, макросы, инструкции)
Aiwan \ (•◡•) / _bot
А стандарта, который позволяет делать то, что я хочу, не существует?
существует. асм называетсся. как напишешь , так и будет работать
Aiwan \ (•◡•) / _bot
видимо возврат к вызывающему коду
Aiwan \ (•◡•) / _bot
sub esp, 2×4 out 1,2 push in push in call stdcall pop out 1 pop out 2
так вроде ты не сказал, чем тебя это не устраивает. есть параметры входные, есть выходные. процедура заканчивается и в стеке остаются выходные параметры, потом их от туда и забираем
The Bird of Hermes
sub esp, 2×4 out 1,2 push in push in call stdcall pop out 1 pop out 2
Ну такое меня тоже ± устраивает
The Bird of Hermes
Только у меня это работает чутка иначе
The Bird of Hermes
sub esp, 2×4 out 1,2 push in push in call stdcall add esp, 2×4 in 1,2 pop out 1 pop out 2
The Bird of Hermes
И вот эту вот строчку, которой у тебя нет, мне бы хотелось засунуть в процедуру как раз
The Bird of Hermes
Чтобы она это делала сама
Aiwan \ (•◡•) / _bot
смыл? у тя pop не то будет попать выходные параметры
The Bird of Hermes
смыл? у тя pop не то будет попать выходные параметры
Ах да, ещё поправка, я использую не std call, а cpp
Aiwan \ (•◡•) / _bot
я не знаком с этим, чтоб с этим работать
The Bird of Hermes
Aiwan \ (•◡•) / _bot
значит ему так надо
The Bird of Hermes
sub esp, 2×4 out 1,2 push in push in call stdcall pop out 1 pop out 2
Я так понял, в твоём примере всё делается ручками, без использования arg или local?
Aiwan \ (•◡•) / _bot
изначально так и надо делать, чтоб понять механизм, а потом можно и макросами упрощать, если надо и можешь, в случае нехватки стандартных директив
The Bird of Hermes
изначально так и надо делать, чтоб понять механизм, а потом можно и макросами упрощать, если надо и можешь, в случае нехватки стандартных директив
Ну я так и делал, мне было неудобно, покопался в гугле, нашёл такие вот соглашения, подумал - круто, небось можно перевести всё это неудобное месиво в человеческий вид
Aiwan \ (•◡•) / _bot
твое соглашение ни скем не согласовывалось и не пользоавлось другими
The Bird of Hermes
твое соглашение ни скем не согласовывалось и не пользоавлось другими
Ну мне кажется это логичным, создать соглашение, позволяющее имитировать принцип работы функций из высокоуровневых языков с передачей через стек
Aiwan \ (•◡•) / _bot
как понять функции из ЯВУ? у си со своей библиотекой свое соглашение (cdecl). функции винды х32 - stdcall и то в спраке смотреть надо. в спп не знаю, но думаю это связано с использованием ООП
The Bird of Hermes
Всё, я добился всего что хотел и даже больше
The Bird of Hermes
Макросы - бомба
The Bird of Hermes
Макросы - бомба
А макросы можно из библиотеки вызывать?
Aiwan \ (•◡•) / _bot
А макросы можно из библиотеки вызывать?
смотря чем представлена она - "библиотека"
Aiwan \ (•◡•) / _bot
.lib
нет
The Bird of Hermes
нет
А с помощью include из asm файла?
Aiwan \ (•◡•) / _bot
да
The Bird of Hermes
Кстати, я ещё читал про такую штуку, как .inc
The Bird of Hermes
Как их создавать?
Eugene
INC - это просто кусок текста, который вставляется в место подключения как есть. LIB - это несколько OBJ, собранных в единый файл, ты их через include никак не подключишь. Они подключаются при компоновке. Можно комбинировать OBJ, LIB.
Aiwan \ (•◡•) / _bot
The Bird of Hermes
ctlr+n save as *.inc
А для оформления используется любая стандартная модель?
The Bird of Hermes
Tiny например
Aiwan \ (•◡•) / _bot
А для оформления используется любая стандартная модель?
не понял тебя. какое оформление, причем здесь модель?
Eugene
А для оформления используется любая стандартная модель?
Зачем тебе в INC засовывать модель? Ты будешь и в основном исходнике, и в INC указывать модель?
Eugene
Я в говорю: код вставляется как есть. Если ты 2 раза укажешь модель, что будет? Модель нужно указать один раз для каждой единицы трансляции (для каждого создаваемого объектного модуля).
The Bird of Hermes
А можно указать использование файла .lib не в командной строке, а в самом asm файле?
Eugene
Даже на С/С++ нельзя. А вот на Паскале, например, можно.
The Bird of Hermes
Даже на С/С++ нельзя. А вот на Паскале, например, можно.
Я так понял ассемблер вставляет сразу весь текст из .inc на то место, где прописано include, а в случае с .lib используются только конкретные функции?
Eugene
1. Да. 2. Используются только те OBJ'и (полностью) из LIB, которые используются.
Eugene
Поэтому лучше каждую функцию писать в отдельном исходнике.
The Bird of Hermes
1. Да. 2. Используются только те OBJ'и (полностью) из LIB, которые используются.
То есть лучше распихивать функции по разным obj'ам, понял
Eugene
Используемые внешние функции нужно объявлять через extrn.
The Bird of Hermes
Их ещё надо public делать в исходнике
s54820
Даже на С/С++ нельзя. А вот на Паскале, например, можно.
И раз, и два. Второе при желании можно даже в фасме, если format coff и линкер ms-совместимый.
Eugene
И раз, и два. Второе при желании можно даже в фасме, если format coff и линкер ms-совместимый.
Давно я на масме не писал, забыл уже про это 😂 А про прагма либ не знал 😉
Eugene
И раз, и два. Второе при желании можно даже в фасме, если format coff и линкер ms-совместимый.
Как в исходнике на fasm указать либу, интересно? Не dll, конечно.
Aiwan \ (•◡•) / _bot
Как в исходнике на fasm указать либу, интересно? Не dll, конечно.
в мечтах сделать макрос(ы) для подключения obj прям в исходнике, чтоб он объектники в прогу всобачивал. аля раздельная компиляция
s54820
Как в исходнике на fasm указать либу, интересно? Не dll, конечно.
Секцию создать .drectve с флагом IMAGE_SCN_LNK_INFO и куском командной строки линкера внутри.
s54820
а можно тут поподробней? я что то не знаю?
format ms coff section '.text' code readable executable public start as '_start' extrn '__imp__InitCommonControls@0' as InitCommonControls:dword start: call [InitCommonControls] ret ; не помню уже, обязательно ли linkremove section '.drectve' linkinfo linkremove db '/ENTRY:start /DEFAULTLIB:comctl32.lib /SUBSYSTEM:WINDOWS' fasm file.asm file.obj и link file.obj (polink file.obj тоже подойдёт). Если уберёшь /DEFAULTLIB из .drectve, перестанет находить comctl32.lib, и её придётся явно указывать в командной строке линкера. Можно указывать сколько угодно /DEFAULTLIB, но логика линкера остаётся стандартной — прилинкуются только те, символы из которых реально используются.
The Bird of Hermes
Можно как-то писать функции для библиотеки так, чтобы они вызывались в любой модели?
s54820
Можно как-то писать функции для библиотеки так, чтобы они вызывались в любой модели?
Да. Сделать far. При необходимости вызывать как near: push arg push arg ... push cs call near func