Прерывание Bios

Discussion in 'WASM.BEGINNERS' started by DioNNiS, Sep 11, 2006.

  1. DioNNiS

    DioNNiS New Member

    Blog Posts:
    0
    Joined:
    Sep 8, 2006
    Messages:
    25
    Подскажите пожалуйста, при помощи какого прерывания можно вывести символ на экран, очистить экран.
    Буду очень признателен, если покажите пример.
    Заранее спасибо!
     
  2. Mika0x65

    Mika0x65 New Member

    Blog Posts:
    0
    Joined:
    Jul 30, 2005
    Messages:
    1,384
    Не дока в этих вопросах, но думаю, что тебе нужны функции прерывания 0x10, если речь идет о ф-иях BIOS. Я, например, делаю так:

    Code (Text):
    1. xor ds, ds       ;Предполагается, что cтрока находится в физ. первых 64К.
    2. mov si, string           ;si -- указатель на начало строки.
    3. mov cx, string_len    ;cx -- длина, включая NULL.
    4. .l00p:
    5. lodsb
    6. test al, al               ;Строка null-terminated, тут можно ввести любой признак.
    7. jz .exit
    8. mov bx, 0x7
    9. mov ah, 0xE           ;Эта ф-ия выводит символ из al и продвигает каретку.
    10. int 0x10                 ;Поехали!
    11. jmp .l00p
    12. .exit:
    13. ret
    Подробнее об этом всем можно почитать тут: http://www.cs.cmu.edu/~ralf/interrupt-list/
     
  3. DioNNiS

    DioNNiS New Member

    Blog Posts:
    0
    Joined:
    Sep 8, 2006
    Messages:
    25
    Я прошу прощение, но я совсем BEGINNER =)) Поясните пожалуйста:
    1. Как задается string?
    2. string_len - это величина генерируемая автоматически или ее еужно самому программисту считать?
     
  4. Mika0x65

    Mika0x65 New Member

    Blog Posts:
    0
    Joined:
    Jul 30, 2005
    Messages:
    1,384
    1. Самое простое, думаю, задать с помощью директивы 'db'.
    Code (Text):
    1. string: db 'String which you need',0x0
    -- это для FASM.
    2. Зависит от желания и ассемблера -- можно вручную посчитать, ну а если хочется автоматом, то для FASM это будет выглядеть так:
    Code (Text):
    1. string: db 'String which you need',0x0
    2. string_len = $ - string
    это без выделения места под переменную string_len. Если хочется выделить место под переменную и проинициализировать ее длиной строки, то будет так:
    Code (Text):
    1. string: db 'ABC',0x0
    2. string_len: db $ - string
    Это опять же для FASM. Ну и в коде, в этом случае нужно использовать 'mov cx, [string_len]' вместо 'mov cx, string_len'.

    А вообще -- лучше хорошенько почитать соответствующу лит-ру :).