Помогите новичку

Applications development, KoOS API questions
  • выводит число в консоль.
    debug.inc

    Code: Select all

    macro debug_print_dec arg
    {
       pushf
       pushad
       if ~arg eq eax
         mov  eax,arg
       end if
       call debug_outdec
       popad
       popf
    }
     
    dpd fix debug_print_dec
  • Как мне быстро узнать значение var, используя __var?
    а разве так не должно работать?

    Code: Select all

    dpd    [__var]
  • [__var] вернет адрес на _var, а нужно еще [_var], что бы получить var, тоесть [[__var]]. В __var храниться адрес _var, а уже в нем хранится адрес на var, в котором и храниться значение. Немного криво назвал переменные, сам путаюсь
  • Сделай обертку и все.
  • Согласен с Asper, только обертка того кода что ты используешь позволит сделать эту запись красивее, но надо ли?
  • Дело было даже не в красоте кода, ну ладно, спасибо всем.
  • ПРОБЛЕМА РЕШЕНА
    И снова я.
    Программа на фасме, размером в 3кб(бинарник) и больше не хочет запускаться. А еолайт даже пишет почему: "Error #31 File is not executable".
    А мне позарез нужно запихнуть туда 7 кб.
    Самое странное - код успешно компилируется, создаётся бинарник, а вот запускаться не хочет. Никаких ошибок в BOARD не пишет (не в user, не в kernel).
    Прилагаю рабочий код, но если в этом коде убрать ";" у любой строки в конце типа ' file "icons/..." '. Как исправить или как увеличить допустимый размер бинарника?
    Attachments
    Downloaded 178 times
    @notify - cur.7z (6.25 KiB)
    Downloaded 169 times
  • eAndrew wrote:Как исправить или как увеличить допустимый размер бинарника?
    Исправить заголовок: сейчас объём выделяемой памяти 0x1000 байт, чего не хватает даже для загрузки бинарника. Должно быть что-то вроде

    Code: Select all

    db 'MENUET01'
    dd 0x01, __START, __END, __MEMORY, __MEMORY, ...
    ...
    _START:
    ...
    ; инициализированные данные
    db 0
    __END: ; эта метка должна быть сразу после всех инициализированных данных
    ; неинициализированные данные
    ...
    ; резервируем место для стека; помним, что невыровненный стек - сильный удар по производительности
    align 4
    rb 1024 ; пока нет сложных цепочек вызовов, 1 Кб должно хватать
    __MEMORY:
    
    Сделаем мир лучше!
  • ; резервируем место для стека; помним, что невыровненный стек - сильный удар по производительности
    align 4
    Спасибо, буду знать.
  • Есть проблема и я не понимаю в чём дело. Уже голову сломал:
    нашёл punk_joker wrote: 1. запускаем Eolite, открываем окно "О Eolite"
    2. жмём на ссылку, открывается htmlv
    3. закрываем htmlv
    4. перемещаем окно "О Eolite", окно вылетает (крэшится)
    Из хаоса в космос
  • Leency wrote:Есть проблема и я не понимаю в чём дело. Уже голову сломал:
    Вангую что проблема в том, что ты не понимаешь Как работает стек?

    Поскольку с ассемблером у тебя хоть и лучше, но все таки тяжело, то подсказка:
    При занесении данных вершина стека перемещается к меньшему адресу
    А у тебя последний поросенок остался без титьки:
    Spoiler:
    case 10: //F10
    RunProgram(EDITOR_PATH, abspath("Eolite.ini"));
    break;
    }
    }


    stop:

    char about_stak[512];
    char menu_stak[512];
    char open_with_stak[512];
    char copy_stak[4096];
    Т.е. указатели на начало области стоят, а нужно их на конец области ставить. В твоем случае в char copy_stak[4096] вообще без всякой пользы пропадает 4 Кб ОЗУ. Не то чтобы они не нужны, но они ну совсем никак не используются.

    И это при том, что я в С-- не в зуб ногой. :lol:
    Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!
  • Спасибо за ссылку. Я действительно не понимаю. Сейчас буду читать.
    Spoiler:Вообще нормальная книга по асму у меня в плане прочтения, но к сожалению после
    - книги по HTML на 760 страниц :), которую я сейчас читаю
    - книги по сертификации тестировщиков
    - книги по экстремальному программированию
    + вот тут уже будет ассмеблер и затем книга по строению ОС.
    Из хаоса в космос
  • Прочитал. Т.е. правильно писать не
    CreateThread(#about_dialog,#about_stak);
    а
    CreateThread(#about_dialog,#about_stak+512); //512 - размер стека
    ?

    Также, если по-простому, то размер стека определяет максимальное количество push'ов без pop'ов в программе? :)
    Из хаоса в космос
  • Leency wrote:Прочитал. Т.е. правильно писать не
    CreateThread(#about_dialog,#about_stak);
    а
    CreateThread(#about_dialog,#about_stak+512); //512 - размер стека
    ?
    Да.
    Spoiler:Ответ в стиле нашего Анонимного Анонимуса. :lol:
    Но теоретически лучше, 512-4, чтобы наверняка не попасть на чужую сиську.
    Spoiler:Хотя сам я лентяй и так не делаю, хотя зря я так не делаю.
    Leency wrote:Также, если по-простому, то размер стека определяет максимальное количество push'ов без pop'ов в программе? :)
    Нет.

    Если стек не используется для хранения дополнительных данных (а компиляторы ЯВУ часто любят делать ESP - X dword и запихивать свои данные в стек, например локальные переменные и возможно массивы), то максимальная вложенность push, которая присутствует в коде. Еще push'и разные бывают, к примеру pusha или pushad, которые ловким движением отправляют содержимое нескольких регистров в стек. В общем лучше перебдеть со стеком, чем недобдеть - 640 Кб 4 Кб обычно достаточно, экспериментальным путем можно уменьшить размер. Стеки дополнительных потоков это абсолютно такие же стеки как и стек основного потока, который их породил.
    Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!
  • Who is online

    Users browsing this forum: No registered users and 43 guests