пара простеньких вопросов по FASM

Тема в разделе "WASM.BEGINNERS", создана пользователем varnie, 19 янв 2007.

  1. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    давно не юзал асм, поэтому многое забыл напрочь.

    просьба напомнить - как будет выглядеть на FASMе 16тибитная процедура, которая принимает 3 параметра размерностью в байт, и как ее вызвать правильно.

    что-то типа:
    Код (Text):
    1. proc myProc: param1: BYTE, param2: BYTE, param3: BYTE
    2. ;procedure's code hre
    3. ;
    4. endp
    хочется вызывать ее примерно так:
    Код (Text):
    1. invoke myProc, bl,0,0eh,al
    но так не получается. получается, что здесь push-атся байты, это неправильно или как? и вообще, валидна ли конструкция push al ?

    спасибо за ответ, а то я позабыл все напрочь.
     
  2. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    В фасме нет процедур. А макрос proc написан только для 32/64 режимов.
    Так что пиши через метки, а со временем может и макрос напишешь соответствующий.
     
  3. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    с этим разобрался. а насчет передачи байта как быть?
    не делать же push al ?

    аа, раз я с метками буду работать, то и через стек ничего передавать не надо, так ведь? в регистры закинул что нужно, прыгнул на метку подпрограммы, а там эти регистры и поюзал, а потом назад вернулся. принцип таков?
     
  4. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Угу. В любой книги по асму расписано несколько способов передачи аргументов в подпрограмму: через регистры, стек, глобальную память и т.п. Собственно, отказываясь от proc, ты можешь выбирать любой способ и комбинировать их - это более гибко, чем stdcall :)
     
  5. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    просто как-то неудобно закидывать сразу нужные байты в регистры, чтобы потом в подпрограмме той все обрабатывать (на то она и подпрограмма, чтобы переданные данные обрабатывать так, как ей нужно, имха, наше дело передать ей данные и все). по идее лучше бы ей через стек эти параметры передать, а далее, это уже в подпрограмме один раз реализовать, чтО и куда кидать из этих параметров.
     
  6. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    Наверное надо как компилятор С:
    Код (Text):
    1. mov   al, BYTE...
    2. push  eax
    3. call  foo
    Ну и в функции, конечно используем опять же AL:
    Код (Text):
    1. foo:
    2.   ...
    3.   mov   eax, [ebp + ...]   ; Load Parameter
    4.   ; Use AL here
    5.   ...
    6.   ret
     
  7. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    AsmGuru62
    В 16битном режиме проще использовать не еах, а ах для пуша.
     
  8. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    да, без соответствующего макроса для такого объявления подпрограмм работать с 16битным режимом запаристо, т.к. приходится кувыркаться с этими переданными параметрами, загоняя их с одних регистров, в другие нужные.

    в макросах я не силен. может, у кого-нибудь уже есть соответствующие наработки для этих нужд?
     
  9. pas

    pas New Member

    Публикаций:
    0
    Регистрация:
    18 апр 2003
    Сообщения:
    330
    Адрес:
    Russia
    varnie
    Существующий макрос скопируй, добавь в конце "16" и соответственно измени макрос.
     
  10. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    я не знаю как изменить макрос для работы с 32битным режимом под макрос для работы с 16битным режимом. dword-ы на word-ы менять итд?
     
  11. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    посидел, вроде бы переделал proc32.inc под 16битный режим.
    но ругается при вот таком теперь коде:
    Код (Text):
    1.  proc testProc, x:BYTE,y:BYTE
    2.  ;...
    3.  ;...
    4.  mov dh, y
    5.  mov dl, x    
    6.  ;...
    7.  endp
    8.  
    9.  
    10. invoke testProc,10,0
     
  12. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    varnie
    Ну как минимум mov dl,[x].
    Да и учти, что invoke func - это call [func]
     
  13. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    да, я это учел.
    я заменил в макросе invoke
    call [proc]
    на
    call proc
    , так что переход на процедуру происходит нормально.
    а вот касательно mov dl,[x] : если я так делаю, то в dl заносится какая-то неразбериха (из памяти мусор), а не то значение, которое я в кач-ве x передавал в эту процедуру.
    опять что-то в макросах нужно править, не подскажете?
    спасибо за терпение
     
  14. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Где-то ошибка, значит. Скачай на форуме фасма утилиту препроцессинга, разберись с ней и пропусти свои макросы через неё. Поможет.
     
  15. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    varnie
    По моему в мануале примеры достаточно доходчивые ;) только при ret если у тебя не С стиль функции, то явно указывай количество удаляемых из стека байт. Масм это автоматически подставляет, а тут похоже вручную нужно.