1. Если вы только начинаете программировать на ассемблере и не знаете с чего начать, тогда попробуйте среду разработки ASM Visual IDE
    (c) на правах рекламы
    Скрыть объявление

Как собирать проект на masm, включающий в себя несколько asm файлов?

Тема в разделе "WASM.BEGINNERS", создана пользователем oxvlad, 28 авг 2009.

  1. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.548
    Адрес:
    Russia
    у нас тут глупый сыр-бор

    MASM как пакет утилит обладает достаточной функциональностью чтобы добиться всего чего хочется - не прямо так косвено

    FASM по вашему описанию обладает стандартными возможностями чуть шире чем масм но все это примочки аля режим идеал в тасме

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

    Вам нравится фасм - наздоровье, учитесь хорошо

    как писал Нитше - каждому своЁ
     
  2. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.548
    Адрес:
    Russia
    обожаю эти директивы особенно offset
     
  3. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.204
    Rockphorr
    теперь набери 2^32 раз слово offset и ты его будешь ненавидеть (вставка запрещена, как и контролвэ)
     
  4. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.548
    Адрес:
    Russia
    max7C4
    ну ты знаешь копипаст это один из важнейших инструментов кодинга как и набора текста
     
  5. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.204
    Rockphorr
    оладушек, еще один юмора не понимает
     
  6. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Rockphorr
    А может лучше сразу фасм на масме и напишем, чем каждый раз "универсальную" обёртку писать?
    [sarcasm]"Это много кто юзоет, тот знает зачем это" © Clerk[/sarcasm]
    Вообще это не стилизация. Относительно много уязвимостей, позволяющих исполнить содержимое ASCII-строки (как минимум в ней не должно содержаться нулевых символов). Правда, в связи с появлением аппаратного DEP'а код этот стал практически бесполезен.
    HEX-редактор, как одна утилита, обладает достаточной функциональностью, чтобы добиться всего, чего хочется.
    Вопрос в удобстве и потраченном на это времени.

    А эти offset'ы и addr'ы я вообще никогда не понимал.
    push variable и push offset variable Результаты идентичны. Лишний раз чего-то набирать в кайф что ли?
     
  7. Microedition

    Microedition Member

    Публикаций:
    0
    Регистрация:
    5 июн 2008
    Сообщения:
    658
    да нет, в masm результаты будут разные.

    в первом случае в EAX загружается значение переменной variable,
    в втором - её адрес.
     
  8. Microedition

    Microedition Member

    Публикаций:
    0
    Регистрация:
    5 июн 2008
    Сообщения:
    658
    а в fasm:

    Код (Text):
    1. mov    eax, variable   ;; адрес переменной
    2. mov    eax, [variable] ;; значение переменной
    аналогично в nasm.
     
  9. Microedition

    Microedition Member

    Публикаций:
    0
    Регистрация:
    5 июн 2008
    Сообщения:
    658
    тьфу, блин.. сплю на ходу.

    в стек, естесственно.
     
  10. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Microedition
    Я сравнивал fasm-вариант и masm-вариант. Смысла сравнивать masm с masm'ом как-то не увидел.
     
  11. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.548
    Адрес:
    Russia
    l_inc

    пользуйся фасмом раз тебе удобно - как и другие кто пользуется тем чем им удобно

    говорить на чужие инструменты гофно не этично независимо от того чем пользуешься

    offset и фасмовские скобки это решения одной и тойже проблемы с разных сторон
    masm
    lea ax,var или mov ax, offset var - загрузка адреса

    mov ax,var - загрузка значения ячеки по адресу

    fasm
    lea ax,var или mov ax,var

    mov ax,[var]

    тоесть если в масме от офсета я спасусь используя lea, то вас от скобок ничто не спасет
     
  12. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.548
    Адрес:
    Russia
    ну я так не пушу

    lea ax,var
    push ax

    аналогично для 32
    пуши с непосредственным операндом огромны
     
  13. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.204
    Rockphorr
    мододца
    push var ; 0xFF 0x36 offset16 var или для 32-х бит 0xFF 0x36 offset32 var

    lea ax, var ; 0x8D 0x36 offset16 var или для 32-х бит 0x67 0xFF 0x36 offset32 var
    push ax ; без комментариев (но надеюсь всем понятно, что это 0x50)
     
  14. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.204
    а да еще 0x66 для lea забыл дописать. видать надо отсыпаться уже.
     
  15. Microedition

    Microedition Member

    Публикаций:
    0
    Регистрация:
    5 июн 2008
    Сообщения:
    658
    Кроме инструкций push и pop при передаче параметров
    через стек можно поступить так:
    Код (Text):
    1. proc_add:
    2.     mov    eax, dword[esp+4]
    3.     add    eax, dword[esp+8]
    4. ret
    5.  
    6. main:
    7.     sub    esp, 2 * 4  ;; 2 - кол-во параметров для подпрограммы
    8.                        ;;  4 - размер в байтах одного параметра.
    9.  
    10.     mov    dword[esp+4], 5
    11.     mov    dword[esp+0], 4
    12.     call    proc_add
    13.  
    14. ;; аналог с push / pop
    15. ;   push    5
    16. ;   push    4
    17. ;   call    proc_add
    18.  
    19.     add    esp, 2 * 4
    20. ret
     
  16. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.204
    Код (Text):
    1. sub    esp, 2 * 4 ; 0x83 0xEC 0x08
    2.  
    3. mov    dword [esp+4], 5 ; 0xC7 0x44 0x24 0x08 0x00000005
    4. mov    dword [esp+0], 4 ; 0xC7 0x04 0x24 0x00000004
    5.  
    6. push    5 ; 0x6A 0x05
    7. push    4 ; 0x6A 0x04
    8.  
    9. add    esp, 2 * 4 ; 0x83 0xC4 0x08
    т.е. для esp всегда будет сгенерирован sib байт, если не ошибся с цифрами (но это не главное)
     
  17. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    2.765
    Microedition, max7C4
    Чтобы избавится от лишней add esp, 2*4 можно чтобы proc_add заканчивалась retn 8,
    а во вторых передача константных аргументов 5 и 4 в функцию proc_add можно сделать как завещал великий классик в Ассемблерные извращения - натягиваем стек
    там предлагается заменить
    Код (Text):
    1.                 push  000000669
    2.                 push  000000999
    3.                 push  000000696
    4.                 call  my_func
    на
    Код (Text):
    1. .code
    2.         MOV EBP, ESP
    3.         MOV ESP, offset func_arg + 4
    4.         CALL my_func
    5.         MOV ESP, EBP
    6. .data
    7.         func_arg        DD 00h, 696h, 999h, 669h
    Код (Text):
    1. .code
    2.         MOV EBP, ESP
    3.         MOV ESP, offset func_arg + 4
    4.         JMP my_func
    5. here: MOV ESP, EBP
    6. .data
    7. func_arg DD offset here, 696h, 999h, 669h
     
  18. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.548
    Адрес:
    Russia
    юмор тут в разделе улыбнитесь
     
  19. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.548
    Адрес:
    Russia
    вы не учитываете повторное использование -
    часто загуженное смещение в пределах одной подпрограммы надо пушить несколько раз при вызове разных сервисов - вот тогда моё lea и окупиться
     
  20. Microedition

    Microedition Member

    Публикаций:
    0
    Регистрация:
    5 июн 2008
    Сообщения:
    658
    ну, тогда другой пример.

    Код (Text):
    1. proc_add:
    2.     mov    eax, dword[esp+4]
    3.     add    eax, dword[esp+8]
    4. ret
    5.  
    6. proc_sub:
    7.     mov    eax, dword[esp+4]
    8.     sub    eax, dword[esp+8]
    9. ret
    10.  
    11. proc_xor:
    12.     mov    eax, dword[esp+4]
    13.     xor    eax, dword[esp+8]
    14. ret
    15.  
    16. some_proc:
    17.     mov    eax, dword[esp+4]
    18.     xor    eax, dword[esp+8]
    19.     and    eax, dword[esp+12]
    20. ret
    21.  
    22. main:
    23.     sub    esp, 3 * 4  ;; 2 - макс. кол-во параметров для всех
    24.                        ;; вызываемых подпрограмм.
    25.                        ;;  4 - размер в байтах одного параметра.
    26.  
    27.     mov    dword[esp+4], 5
    28.     mov    dword[esp+0], 4
    29.     call    proc_add
    30.  
    31. ;   mov    dword[esp+4], 5 ;; уже не надо.
    32. ;   mov    dword[esp+0], 4
    33.     call    proc_xor
    34.  
    35.     mov    dword[esp+4], 34
    36. ;   mov    dword[esp+0], 4
    37.     call    proc_sub
    38.  
    39.     mov    dword[esp+8], 12
    40. ;   mov    dword[esp+4], 34
    41. ;   mov    dword[esp+0], 4
    42.     call    some_proc
    43.  
    44.     add    esp, 3 * 4
    45. ret
    Избавились от RET. И не только