Page 59 of 77

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

Posted: Thu Oct 10, 2013 4:18 pm
by Akyltist
eAndrew - а можно узнать что такое dpd.

Code: Select all

mov   eax, [__var]
dpd    [eax]
Dual Purpose Device ??? или это что-то из ассемблера?

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

Posted: Thu Oct 10, 2013 4:19 pm
by e-andrew
выводит число в консоль.
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

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

Posted: Thu Oct 10, 2013 4:41 pm
by Akyltist
Как мне быстро узнать значение var, используя __var?
а разве так не должно работать?

Code: Select all

dpd    [__var]

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

Posted: Thu Oct 10, 2013 4:44 pm
by e-andrew
[__var] вернет адрес на _var, а нужно еще [_var], что бы получить var, тоесть [[__var]]. В __var храниться адрес _var, а уже в нем хранится адрес на var, в котором и храниться значение. Немного криво назвал переменные, сам путаюсь

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

Posted: Thu Oct 10, 2013 4:55 pm
by Asper
Сделай обертку и все.

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

Posted: Thu Oct 10, 2013 4:57 pm
by Akyltist
Согласен с Asper, только обертка того кода что ты используешь позволит сделать эту запись красивее, но надо ли?

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

Posted: Thu Oct 10, 2013 5:12 pm
by e-andrew
Дело было даже не в красоте кода, ну ладно, спасибо всем.

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

Posted: Fri Oct 11, 2013 9:54 pm
by e-andrew
ПРОБЛЕМА РЕШЕНА
И снова я.
Программа на фасме, размером в 3кб(бинарник) и больше не хочет запускаться. А еолайт даже пишет почему: "Error #31 File is not executable".
А мне позарез нужно запихнуть туда 7 кб.
Самое странное - код успешно компилируется, создаётся бинарник, а вот запускаться не хочет. Никаких ошибок в BOARD не пишет (не в user, не в kernel).
Прилагаю рабочий код, но если в этом коде убрать ";" у любой строки в конце типа ' file "icons/..." '. Как исправить или как увеличить допустимый размер бинарника?

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

Posted: Fri Oct 11, 2013 10:16 pm
by CleverMouse
eAndrew wrote:Как исправить или как увеличить допустимый размер бинарника?
Исправить заголовок: сейчас объём выделяемой памяти 0x1000 байт, чего не хватает даже для загрузки бинарника. Должно быть что-то вроде

Code: Select all

db 'MENUET01'
dd 0x01, __START, __END, __MEMORY, __MEMORY, ...
...
_START:
...
; инициализированные данные
db 0
__END: ; эта метка должна быть сразу после всех инициализированных данных
; неинициализированные данные
...
; резервируем место для стека; помним, что невыровненный стек - сильный удар по производительности
align 4
rb 1024 ; пока нет сложных цепочек вызовов, 1 Кб должно хватать
__MEMORY:

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

Posted: Fri Oct 11, 2013 10:19 pm
by e-andrew
; резервируем место для стека; помним, что невыровненный стек - сильный удар по производительности
align 4
Спасибо, буду знать.

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

Posted: Thu Oct 17, 2013 7:56 pm
by Leency
Есть проблема и я не понимаю в чём дело. Уже голову сломал:
нашёл punk_joker wrote: 1. запускаем Eolite, открываем окно "О Eolite"
2. жмём на ссылку, открывается htmlv
3. закрываем htmlv
4. перемещаем окно "О Eolite", окно вылетает (крэшится)

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

Posted: Thu Oct 17, 2013 11:50 pm
by Mario_r4
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:

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

Posted: Fri Oct 18, 2013 12:08 am
by Leency
Спасибо за ссылку. Я действительно не понимаю. Сейчас буду читать.
Spoiler:Вообще нормальная книга по асму у меня в плане прочтения, но к сожалению после
- книги по HTML на 760 страниц :), которую я сейчас читаю
- книги по сертификации тестировщиков
- книги по экстремальному программированию
+ вот тут уже будет ассмеблер и затем книга по строению ОС.

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

Posted: Fri Oct 18, 2013 12:36 am
by Leency
Прочитал. Т.е. правильно писать не
CreateThread(#about_dialog,#about_stak);
а
CreateThread(#about_dialog,#about_stak+512); //512 - размер стека
?

Также, если по-простому, то размер стека определяет максимальное количество push'ов без pop'ов в программе? :)

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

Posted: Fri Oct 18, 2013 1:02 am
by Mario_r4
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 Кб обычно достаточно, экспериментальным путем можно уменьшить размер. Стеки дополнительных потоков это абсолютно такие же стеки как и стек основного потока, который их породил.