FASM размещение данных в любом месте программы

Тема в разделе "WASM.ASSEMBLER", создана пользователем Y_Mur, 24 апр 2007.

  1. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Нда почему-то это работает только на пробных MessageBox :dntknw:(
    Неужели фасм настолько кривой и не лечится?
     
  2. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Но-но.

    Ты выбрал не совсем верный (хотя и оригинальный) путь - рекурсивное определение макросов. Лучше было бы просто склеивать строки и класть в начало/конец.
     
  3. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    IceStudent
    Так для того и запостил, чтобы если в нём есть хитрые грабли, то кто нибудь на них указал, но как заметил halyavin Колибривци так же поступают ;)
    Понятно, что рекурентный макрос, например, с подменой mov - жуткий торомоз, но здесь таких проблем вроде быть не должно :) и сам по себе этот подход нормально работает :)

    Но проблема возникла, когда я попытался подкорректировать штатный макрос pushd, и теперь не пойму почему invoke стал правильно обрабатывать строку переданную текстом, но перестал работать со строкой переданной по ссылке?
     
  4. dead_body

    dead_body wasm.ru

    Публикаций:
    0
    Регистрация:
    3 сен 2004
    Сообщения:
    603
    Адрес:
    Украина;г.Харьков;г.Н.Каховка
    Y_Mur
    посмотри Фасмлиб и макрос libcall. Просто используй его вместо invoke и будет тебе счастье, он сам всё будет собирать за собой.
     
  5. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Y_Mur
    заюзал твою шню с __data.

    когда пишу
    cinvoke DbgPrint, "Hello world"
    все работает прекрасно

    когда пишу
    cinvoke DbgPrint, "Value: %08x", edx
    оно у тебя пытается EDX принять за строку)) хотя странно, у тебя стоит вроде if value eqtype ''

    приходится извращаться:
    push edx
    cinvoke DbgPrint, "Value: %08x"
    add esp, 4
     
  6. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    dead_body
    Посмотрел fasmlib, спасибо - кое-что почерпнул, но пожалуй соглашусь на счёт:
    IceStudent
    Про рекурсивный макрос ты частично прав, проблемы возникли из-за того, что:
    Но на счёт символьных строк - с ними та же самая проблема, так что принципиальной разницы нет (есть только лишние нелепые трудности) вот и приходится извращаться (fasmlib тоже решает эту проблему через рекурсию в макросе, обходя if грабли путём весьма интенсивной "пляски с бубном").

    Great
    И я о том же в #21, но теперь разобрался и пофиксил :)

    В match мне не удалось измудриться проверить value eqtype '' (конструкция match pushd ='strvalue',pushd value не сработала), поэтому пока остановился на варианте с "псевдомакрофункциями", полученными через match pushd =zSTR(strvalue),pushd value
    Код (Text):
    1. include 'win32axm.inc'
    2. .code
    3.   start:
    4.     invoke  MessageBox, HWND_DESKTOP, zSTR('Привет!'), zSTR('Я изучаю FASM'), MB_OK
    5.     invoke  MessageBox, HWND_DESKTOP, zsAlt, zSTR('Я продолжаю изучать FASM'), MB_OK
    6.     invoke  ExitProcess, 0
    7. .data
    8.   zsAlt db 'Альтернатива !!!', 0
    9. .end start
    Конечно до хорошего ещё далеко, поскольку нельзя определить ни именную строку: zSTR(zsHello, 'Привет!'), ни строку со спецсимволами: zSTR(<'Строка', 13, 10, 'ещё строка'>), но всё равно лучше исходного call варианта :).
    Остальные нюансы применения win32axm.inc остались как в #20