Page 4 of 8

Posted: Thu Jun 15, 2006 4:26 pm
by diamond
Добавлена документация по новым подфункциям 5 и 6 функции 70. В текстовой версии (и в svn-версии) описана также новая функция 18.18 завершения процесса по PID.

Posted: Tue Jun 20, 2006 3:28 pm
by diamond
Обновление, теперь во все версии включено описание функции 18.18.

Posted: Fri Jun 23, 2006 12:55 pm
by halyavin
Нашел небольшую ошибку в klbr_doc.chm - в функции 62/8,9,10 не сказано, что посылаемое значение записывается в dl/dx/edx.

Posted: Sun Jun 25, 2006 10:40 pm
by Mario79
diamond
Нужно в документацию функции 70 добавить, что поддерживается не только RD, FD и HDx, но и CDx, для подфункций: 0,1,5.

Posted: Mon Jun 26, 2006 3:20 pm
by diamond
Включена документация по новой функции 70.7 (запуск приложения). В общем описании к 70-й функции добавлен пункт насчёт /CDx.
halyavin

Code: Select all

sys_pci:
        call pci_api
        mov [esp+36], eax
        ret
Вроде бы никаких dl/dx/edx...

Posted: Mon Jun 26, 2006 5:58 pm
by Mario79
diamond
В документацию 70 функции еще нужно добавить в примечаниях, что для подфункций 2, 6 доступ к CD не поддерживается по аппаратным причинам.

Posted: Fri Jun 30, 2006 4:05 pm
by diamond
halyavin
Ой, меня проглючило, там действительно на входе есть dl/dx/edx. Всё-таки у метода copy-paste (в данном случае с подфункций 4,5,6) есть отдельные недостатки. Спасибо.
Mario79
Спасибо за замечание, будет учтено в следующем обновлении.
all
Модификации в связи с новой моделью горячих клавиш (удалена 18.12, изменения в описании событий, функции 2, добавлены 66.3 и 66.4, удалено одно из замечаний в 21.2). Восстановлена документация по 59-й функции.

Posted: Wed Aug 09, 2006 6:53 pm
by diamond
Обновление в документации. Добавлено замечание про CD. Удалено замечание в описании функции 18.6. Несколько мелких исправлений. В описании старых функций работы с рамдиском добавлено замечание о неподдерживаемости папок. Описание функции 4 скорректировано для соответствия с текущей реализацией. Кстати, текущая реализация нелогична - она прекращает вывод по завершающему нулевому символу, но тем не менее требует длину в esi. Если уж так хочется выводить ASCIIZ-строки, логичней было бы предусмотреть, например, старший бит ecx - если он установлен, то не надо задавать esi, поскольку конец строки определяется нулевым символом, а если сброшен, то выводится ровно esi символов. Может, так и сделать? (Даже интересно, кто не проигнорирует этот вопрос? Mario79 наверняка ответит, а вот остальные очень ленивы...)

Posted: Wed Aug 09, 2006 7:02 pm
by nn2
>Кстати, текущая реализация нелогична - она прекращает вывод по завершающему нулевому символу, но тем не менее требует длину в esi.

Если что раньше длина или \0, то имхо это не баг а фича.

Posted: Wed Aug 09, 2006 7:25 pm
by Mario79
nn2
Вопрос не в правильности процедуры, а в ее непродуманности.
То, что предлагает Diamond уменьшает размер кода приложения, так как если текст ограничивать определенным символом, то задавать длину вывода становится излишним.

diamond
Даже интересно, кто не проигнорирует этот вопрос? Mario79 наверняка ответит, а вот остальные очень ленивы...
Как говорил Черномырдин "Мне лучше промолчать, иначе опять, что ни будь скажу..."

Posted: Wed Aug 09, 2006 7:32 pm
by nn2
ИМХО, ничо так поведение. Когда консоль писал пользовалса этой фичей :)

Нет ли приложений полагающихся на это поведение? А так вполне можно ^_~

Posted: Wed Aug 09, 2006 8:26 pm
by Serge
diamond
Может сделать в стиле Win: esi = -1 - строка завершается нулем и система сама определяет её длину, иначе esi = длина строки в символах.

Posted: Thu Aug 10, 2006 2:23 pm
by <Lrz>
Mario79 - если передавать в eсх значение, то код увеличится как минимум на проверку. Можно вариант в студию ?
Мы его детально обсудим.

вот текущий код:

Code: Select all

dtext.lnew:
        test   esi, esi    ; zero length ?
        jnz    @f
        jmp    dtext.output_end
      @@:

        movzx  edx,byte [ebp] ;edx=ascii code
        test   edx,edx
        jz     dtext.output_end
        test   ecx,0x10000000
        jnz    dtext.letnew2

        align 4
      .letnew:
Как видно, в начале проверяется не равна ли длинна строки 0, затем проверяется на 0 символ, загруженный из строки.
к особенности данной функции стоит отнести то, что в ней размыты границы между двумя возможностями. Т.е. условия вывода строк с фиксированной строкой выполнится в полной мере, если в последовательности ASCII строки не будет 0.
ASCII строка не выведется полностью, если в esi будет значение меньше реальной длинны выводимой строки.
Данную особенность можно назвать фитчей, а можно и размытостью, почему я уже написал.
Я думаю стоит определиться.
1) Даже если реализовать вариант предложенный diamond, потребуется проверка
2) Если передавать в esi = -1, то система просто выведет ASCII строку, завершающуюся 0. По сути этот вариант уже реализован, только ASCII строка выведется в любом случае, если в esi загружено число больше или равно длины ASCII строки.

Posted: Thu Aug 10, 2006 5:30 pm
by Mario79
<Lrz>
Я написал:
То, что предлагает Diamond уменьшает размер кода приложения
Я ничего не говорил про ядро.
Для того что предложил diamond вполне допустимо сделать две отдельные процедуры в ядре. Немного увеличив код ядра мы можем гораздо больше выиграть на сокращении кода приложений. Вызов mcall 4 достаточно часто встречается в приложениях. Причем потери скорости будут несущественными, если их вобще удастся замерить.

Posted: Fri Aug 11, 2006 3:27 pm
by diamond
Скорректировано описание 0-й функции, добавлено описание новой функции 71.1.
(Кстати, текущая реализация последней не возвращает значения.)
По поводу 4-й функции. Такое поведение было добавлено уже после дистрибутива 0.5.8.1 (в ревизии 106), так что приложений, полагающихся на эту особенность, быть ещё не должно. Поэтому я и предлагаю это изменить, пока не поздно. Сейчас я буду с кодом в руках доказывать остальным то, что сразу понял Mario79.

Code: Select all

mov eax,4
mov ebx,100*65536+100 ; x=y=100
mov ecx,0x10808080 ; font=1, color=0x808080
mov edx,string
mov esi,string.len
int 0x40
...
string db 'Some string'
.len = $-string
Это нормальный, работающий с давних пор код.

Code: Select all

...
mov esi,string.len
...
string db 'Some string',0,'continued...'
.len = $-string
Этот код до ревизии 106 выведет всю строку (включая 'continued'), нулевой символ будет выведен как пробел. Начиная с ревизии 106 он выведет только первую часть. Вопрос на понимание материала: какой вариант имел в виду программист, писавший такой код?

Code: Select all

...
mov edx,string
mov esi,-1
int 0x40
...
string db 'ASCIIZ-string',0
Вот как предлагается писать для вывода ASCIIZ-строк в текущей версии ядра.
А теперь согласитесь, что в этих целях с точки зрения программы было бы логичнее писать, например, так:

Code: Select all

mov eax,4
mov ebx,100*65536+100 ;x=y=100
mov ecx,0x90808080 ;font=1, старший бит установлен=ASCIIZ-строка, color=0x808080
mov edx,string
int 0x40
...
string db 'ASCIIZ-string',0
При этом остаётся полная совместимость со старым ядром и для вывода ASCIIZ-строк не нужна явно лишняя инструкция заполнения esi (5 байтов или 3 байта с включённой оптимизацией, умножить на количество вызовов функции 4 в программе).