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
Переменная
Aiwan \ (•◡•) / _bot
Ну входной параметр
ну он же в стеке. так адресуйся к нему так как это по стандарту делается
The Bird of Hermes
Aiwan \ (•◡•) / _bot
ну вот, смещением относительно bp и происходит работа с параметрами (входными выходными)
The Bird of Hermes
Aiwan \ (•◡•) / _bot
что за arg?
The Bird of Hermes
Aiwan \ (•◡•) / _bot
а, так эт чтото похожее на прототип. ну тогда все логично. согласно стандарту к параметрам обращение идет через bp
The Bird of Hermes
The Bird of Hermes
Как я читал описание, сначала в стеке идут arg, затем bp, затем local
Aiwan \ (•◡•) / _bot
Ну. Если я значение bp в стеке затру, то плохо будет, скорее всего
ну если ты строишь свой велосипед и используешь сторонние стандарты в купе со своим, то да, будет что то нехорошее. либо пиши все по стандарту, либо изобретай свой стандарт и не используй стандартные механизмы (директивы, макросы, инструкции)
The Bird of Hermes
Aiwan \ (•◡•) / _bot
The Bird of Hermes
Aiwan \ (•◡•) / _bot
видимо возврат к вызывающему коду
The Bird of Hermes
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 не то будет попать выходные параметры
Aiwan \ (•◡•) / _bot
я не знаком с этим, чтоб с этим работать
The Bird of Hermes
Aiwan \ (•◡•) / _bot
значит ему так надо
Aiwan \ (•◡•) / _bot
изначально так и надо делать, чтоб понять механизм, а потом можно и макросами упрощать, если надо и можешь, в случае нехватки стандартных директив
Aiwan \ (•◡•) / _bot
твое соглашение ни скем не согласовывалось и не пользоавлось другими
Aiwan \ (•◡•) / _bot
как понять функции из ЯВУ? у си со своей библиотекой свое соглашение (cdecl). функции винды х32 - stdcall и то в спраке смотреть надо. в спп не знаю, но думаю это связано с использованием ООП
The Bird of Hermes
Всё, я добился всего что хотел и даже больше
The Bird of Hermes
Макросы - бомба
The Bird of Hermes
Aiwan \ (•◡•) / _bot
The Bird of Hermes
нет
А с помощью include из asm файла?
Aiwan \ (•◡•) / _bot
да
The Bird of Hermes
Кстати, я ещё читал про такую штуку, как .inc
The Bird of Hermes
Как их создавать?
Eugene
INC - это просто кусок текста, который вставляется в место подключения как есть.
LIB - это несколько OBJ, собранных в единый файл, ты их через include никак не подключишь. Они подключаются при компоновке. Можно комбинировать OBJ, LIB.
The Bird of Hermes
The Bird of Hermes
Tiny например
Aiwan \ (•◡•) / _bot
The Bird of Hermes
Eugene
Я в говорю: код вставляется как есть. Если ты 2 раза укажешь модель, что будет?
Модель нужно указать один раз для каждой единицы трансляции (для каждого создаваемого объектного модуля).
The Bird of Hermes
The Bird of Hermes
А можно указать использование файла .lib не в командной строке, а в самом asm файле?
Eugene
Eugene
Даже на С/С++ нельзя.
А вот на Паскале, например, можно.
Eugene
1. Да.
2. Используются только те OBJ'и (полностью) из LIB, которые используются.
Eugene
Поэтому лучше каждую функцию писать в отдельном исходнике.
The Bird of Hermes
Eugene
Используемые внешние функции нужно объявлять через extrn.
The Bird of Hermes
The Bird of Hermes
Их ещё надо public делать в исходнике
Eugene
Eugene
Aiwan \ (•◡•) / _bot
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, но логика линкера остаётся стандартной — прилинкуются только те, символы из которых реально используются.
Aiwan \ (•◡•) / _bot
The Bird of Hermes
Можно как-то писать функции для библиотеки так, чтобы они вызывались в любой модели?