Документация

Everything you can't fit into other forums
  • Обновление, теперь во все версии включено описание функции 18.18.
  • Нашел небольшую ошибку в klbr_doc.chm - в функции 62/8,9,10 не сказано, что посылаемое значение записывается в dl/dx/edx.
  • diamond
    Нужно в документацию функции 70 добавить, что поддерживается не только RD, FD и HDx, но и CDx, для подфункций: 0,1,5.
  • Включена документация по новой функции 70.7 (запуск приложения). В общем описании к 70-й функции добавлен пункт насчёт /CDx.
    halyavin

    Code: Select all

    sys_pci:
            call pci_api
            mov [esp+36], eax
            ret
    
    Вроде бы никаких dl/dx/edx...
    Ушёл к умным, знающим и культурным людям.
  • diamond
    В документацию 70 функции еще нужно добавить в примечаниях, что для подфункций 2, 6 доступ к CD не поддерживается по аппаратным причинам.
  • halyavin
    Ой, меня проглючило, там действительно на входе есть dl/dx/edx. Всё-таки у метода copy-paste (в данном случае с подфункций 4,5,6) есть отдельные недостатки. Спасибо.
    Mario79
    Спасибо за замечание, будет учтено в следующем обновлении.
    all
    Модификации в связи с новой моделью горячих клавиш (удалена 18.12, изменения в описании событий, функции 2, добавлены 66.3 и 66.4, удалено одно из замечаний в 21.2). Восстановлена документация по 59-й функции.
    Ушёл к умным, знающим и культурным людям.
  • Обновление в документации. Добавлено замечание про CD. Удалено замечание в описании функции 18.6. Несколько мелких исправлений. В описании старых функций работы с рамдиском добавлено замечание о неподдерживаемости папок. Описание функции 4 скорректировано для соответствия с текущей реализацией. Кстати, текущая реализация нелогична - она прекращает вывод по завершающему нулевому символу, но тем не менее требует длину в esi. Если уж так хочется выводить ASCIIZ-строки, логичней было бы предусмотреть, например, старший бит ecx - если он установлен, то не надо задавать esi, поскольку конец строки определяется нулевым символом, а если сброшен, то выводится ровно esi символов. Может, так и сделать? (Даже интересно, кто не проигнорирует этот вопрос? Mario79 наверняка ответит, а вот остальные очень ленивы...)
    Ушёл к умным, знающим и культурным людям.
  • >Кстати, текущая реализация нелогична - она прекращает вывод по завершающему нулевому символу, но тем не менее требует длину в esi.

    Если что раньше длина или \0, то имхо это не баг а фича.
  • nn2
    Вопрос не в правильности процедуры, а в ее непродуманности.
    То, что предлагает Diamond уменьшает размер кода приложения, так как если текст ограничивать определенным символом, то задавать длину вывода становится излишним.

    diamond
    Даже интересно, кто не проигнорирует этот вопрос? Mario79 наверняка ответит, а вот остальные очень ленивы...
    Как говорил Черномырдин "Мне лучше промолчать, иначе опять, что ни будь скажу..."
  • ИМХО, ничо так поведение. Когда консоль писал пользовалса этой фичей :)

    Нет ли приложений полагающихся на это поведение? А так вполне можно ^_~
  • diamond
    Может сделать в стиле Win: esi = -1 - строка завершается нулем и система сама определяет её длину, иначе esi = длина строки в символах.
  • 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 строки.
  • <Lrz>
    Я написал:
    То, что предлагает Diamond уменьшает размер кода приложения
    Я ничего не говорил про ядро.
    Для того что предложил diamond вполне допустимо сделать две отдельные процедуры в ядре. Немного увеличив код ядра мы можем гораздо больше выиграть на сокращении кода приложений. Вызов mcall 4 достаточно часто встречается в приложениях. Причем потери скорости будут несущественными, если их вобще удастся замерить.
  • Скорректировано описание 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 в программе).
    Ушёл к умным, знающим и культурным людям.
  • Who is online

    Users browsing this forum: No registered users and 5 guests