давно не юзал асм, поэтому многое забыл напрочь. просьба напомнить - как будет выглядеть на FASMе 16тибитная процедура, которая принимает 3 параметра размерностью в байт, и как ее вызвать правильно. что-то типа: Код (Text): proc myProc: param1: BYTE, param2: BYTE, param3: BYTE ;procedure's code hre ; endp хочется вызывать ее примерно так: Код (Text): invoke myProc, bl,0,0eh,al но так не получается. получается, что здесь push-атся байты, это неправильно или как? и вообще, валидна ли конструкция push al ? спасибо за ответ, а то я позабыл все напрочь.
В фасме нет процедур. А макрос proc написан только для 32/64 режимов. Так что пиши через метки, а со временем может и макрос напишешь соответствующий.
с этим разобрался. а насчет передачи байта как быть? не делать же push al ? аа, раз я с метками буду работать, то и через стек ничего передавать не надо, так ведь? в регистры закинул что нужно, прыгнул на метку подпрограммы, а там эти регистры и поюзал, а потом назад вернулся. принцип таков?
Угу. В любой книги по асму расписано несколько способов передачи аргументов в подпрограмму: через регистры, стек, глобальную память и т.п. Собственно, отказываясь от proc, ты можешь выбирать любой способ и комбинировать их - это более гибко, чем stdcall
просто как-то неудобно закидывать сразу нужные байты в регистры, чтобы потом в подпрограмме той все обрабатывать (на то она и подпрограмма, чтобы переданные данные обрабатывать так, как ей нужно, имха, наше дело передать ей данные и все). по идее лучше бы ей через стек эти параметры передать, а далее, это уже в подпрограмме один раз реализовать, чтО и куда кидать из этих параметров.
Наверное надо как компилятор С: Код (Text): mov al, BYTE... push eax call foo Ну и в функции, конечно используем опять же AL: Код (Text): foo: ... mov eax, [ebp + ...] ; Load Parameter ; Use AL here ... ret
да, без соответствующего макроса для такого объявления подпрограмм работать с 16битным режимом запаристо, т.к. приходится кувыркаться с этими переданными параметрами, загоняя их с одних регистров, в другие нужные. в макросах я не силен. может, у кого-нибудь уже есть соответствующие наработки для этих нужд?
я не знаю как изменить макрос для работы с 32битным режимом под макрос для работы с 16битным режимом. dword-ы на word-ы менять итд?
посидел, вроде бы переделал proc32.inc под 16битный режим. но ругается при вот таком теперь коде: Код (Text): proc testProc, x:BYTE,y:BYTE ;... ;... mov dh, y mov dl, x ;... endp invoke testProc,10,0
да, я это учел. я заменил в макросе invoke call [proc] на call proc , так что переход на процедуру происходит нормально. а вот касательно mov dl,[x] : если я так делаю, то в dl заносится какая-то неразбериха (из памяти мусор), а не то значение, которое я в кач-ве x передавал в эту процедуру. опять что-то в макросах нужно править, не подскажете? спасибо за терпение
Где-то ошибка, значит. Скачай на форуме фасма утилиту препроцессинга, разберись с ней и пропусти свои макросы через неё. Поможет.
varnie По моему в мануале примеры достаточно доходчивые только при ret если у тебя не С стиль функции, то явно указывай количество удаляемых из стека байт. Масм это автоматически подставляет, а тут похоже вручную нужно.