Page 47 of 77

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

Posted: Thu Mar 07, 2013 9:10 pm
by Sergo
Чтоб не плодить темы. Как выделить память? Нашел Sys68 функция 12, но там написано, что выделяется 4кб. Мне нужно по 12-100 байт примерно, но часто, эта функция каждый раз по 4кб будет выделять?

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

Posted: Thu Mar 07, 2013 9:14 pm
by SoUrcerer
Ограничение менеджера памяти - 4 кб. Нужно меньше, но чаще - советую использовать свой менеджер памяти, в пользовательском режиме.

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

Posted: Thu Mar 07, 2013 9:15 pm
by Sergo
SoUrcerer wrote:Ограничение менеджера памяти - 4 кб. Нужно меньше, но чаще - советую использовать свой менеджер памяти, в пользовательском режиме.
В смысле "написать самому"? В ядре такая же ситуация с выделением памяти?

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

Posted: Fri Mar 08, 2013 7:09 am
by Freeman
Вроде у johnfound во FreshLib весьма развитый менеджер памяти, не?

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

Posted: Fri Mar 08, 2013 8:35 pm
by Serge
Sergo
Тебе нужна malloc, 68.12 ей не является.

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

Posted: Sat Mar 09, 2013 11:23 pm
by Sergo
Где можно посмотреть, что делает int 0x40, когда eax=5? По вики это пауза, по логике программы тут вывод строки...

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

Posted: Sat Mar 09, 2013 11:35 pm
by Wildwest
Где тут? Код выложи или прикрепи.

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

Posted: Sat Mar 09, 2013 11:38 pm
by Sergo

Code: Select all

align 4
; void __stdcall sc_puts(char *str);
_sc_puts:

 push esp
 push ebx

 mov esi, [esp+12]
 mov edi, [sc_buffer]
 mov al, SC_PUTS
 stosb

@@:
 lodsb
 stosb
 test al, al
 jnz @b

 mov ebx, [sc_buffer]

@@:
 mov byte dl, [ebx]
 test dl, dl
 jz @f
 push ebx
 mov eax, 5
 mov ebx, 5
 int 0x40
 pop ebx
 jmp @b

@@:

 pop ebx
 pop esp
 ret 4
 
нашел, когда искал, как вывести строку в консоль, хочу адаптировать под свои нужды

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

Posted: Sun Mar 10, 2013 12:43 am
by Albom
Sergo wrote:Где можно посмотреть, что делает int 0x40, когда eax=5? По вики это пауза, по логике программы тут вывод строки...
Sergo wrote:нашел, когда искал, как вывести строку в консоль, хочу адаптировать под свои нужды
Узнаю свой код. 5-я функция - это действительно пауза. В коде представлена функция вывода строки с нулевым последним байтом для консольных приложений Shell по особому интерфейсу.
1) Консольное приложение Shell, запущенное из него, должно создать именованную область pid-SHELL, где PID - этого приложения. Именованная область - буфер, через который передаются команды и данные.
2) Команд немного (максимальное количество - 255+1) и они есть в инклуде (начинаются с SC_).
3) Функция sc_puts выводит строку - записывает в нулевой байт буфера константу SC_PUTS, а с первого байта - нужную строку. И ожидает до тех пор, пока Shell эту строку не выведет (и установит нулевой байт в константу SC_OK). Чтобы не расходовать процессорное время между проверками нулевого байта, используется 5-я функция. Интервал 0,05 с вполне достаточен, чтобы снизить нагрузку процессора и оставить консольное приложение отзывчивым.

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

Posted: Sun Mar 10, 2013 9:17 am
by Sergo
Спасибо за обстоятельный ответ! :)

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

Posted: Sun Mar 10, 2013 8:57 pm
by Sergo
я сдаюсь. код вот такой

Code: Select all

START:			   ; start of execution

    call  _sc_init
    mov   dword [state], STATE_CONFIG_GLOBAL
    ;call  clear_token_list

main_loop:
    push    dword user_input_raw
    call    _sc_gets
    push    dword test_input
    call    _sc_puts
    push    dword user_input_raw
    call    _sc_puts
    jmp main_loop
test_input  db  'test string',0
user_input_raw rb 256

По идее, после прочитанной строки и перед выводом ее код должен печатать мою строку (test string), но этого не происходит. Печатает только введенную строку. Перед выводом строка должна быть как-то хитро сформирована? В отладчике не могу отловить момент сразу после ввода строки, чтобы посмотреть, что на самом деле происходит...

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

Posted: Sun Mar 10, 2013 9:43 pm
by Mario_r4
1. Вместо ф.5 можно использовать ф.68.1 - это более обосновано сточки зрения работы операционной системы в целом.
2. Все же вместо того чтобы заставлять других гадать на кофейной гуще, полезней было бы выложить весь исходник. Вероятность нахождения причины проблемы в этом случае будет существенно выше.

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

Posted: Sun Mar 10, 2013 10:12 pm
by Sergo
Вопрос снимается.
Я просто все незначительное убрал из кода, что бы не загромождать, на самом деле было так

Code: Select all

param_area	rb  256
app_path	rb  256
test_input  db  'test string',10,13,0
user_input_raw rb 256
Ну и rb затирали нулями строку(Почему, кстати?). Перенес строку выше - все ок стало. Песец, 3 часа убил на это...

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

Posted: Sun Mar 10, 2013 10:22 pm
by Mario_r4
Sergo wrote:Ну и rb затирали нулями строку(Почему, кстати?).
А вот это задачку стоит решить самому, тогда получишь очередной LevelUP в навыках.

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

Posted: Tue Mar 12, 2013 1:47 pm
by 0CodErr
Вернусь к своему давнему сообщению viewtopic.php?f=2&t=684&p=43100#p43100
Ну вот давайте на примере t_edit:

Запускаем программу.

Нажимаем на кнопку с папкой — появляется OpenDialog. Пока уберём его немного в сторону.
Spoiler:Image
Теперь снова нажимаем кнопку с папкой, но отпускаем мышь не сразу(ждём немного). И обращаем внимание на OpenDialog.
Spoiler:Image
Оно так и должно быть?