Получение строки для печати через прерывание bios


Я изучаю сборку и, конечно же, экспериментирую с классическим прерыванием bios 0x10. Ресурсы, которые я рассматривал, показывают использование lodsb для печати строки, поэтому, чтобы понять этот код операции, я пытаюсь имитировать его поведение. Это прекрасно работает с lodsb, но не с тем, что у меня есть. Что я делаю не так?:

start:
    mov ah, 0Eh ;for bios interrupt
    mov si, text_string ;set source index to begining of text_string

.repeat:
    ;I'm trying to emulate the behavior of lodsb to learn how it works:
    mov al, [si] ;put character at si in al register
    add si, 1 ;increment source index

    cmp al, 0 ;if the character is a zero (end of the string)
    je done ;end execution

    int 10h ;bios interrupt to put character on screen
    jmp .repeat

    text_string db 'Hello, World!', 0

done:
    ret
2 3

2 ответа:

Обычно не очень хорошая идея:

  1. предположим, что все регистры сохраняются при вызовах прерывания (или любых вызовах, на самом деле); или
  2. не настраиваются все необходимые регистры для данного вызова.

На этой первой ноте я бы поставил ah в 0eh непосредственно перед int 10.

Int 10h/0eh требуется, чтобы bh и bl были установлены в номер страницы и цвет переднего плана соответственно. Я бы также сделал это непосредственно перед int 10, чтобы убедиться, что они установлены правильно для звонка.


В качестве отступа, вам нужно убедиться, что регистр сегмента ds корректен, с чем-то вроде:

push cs
pop ds

Поскольку похоже, что вы помещаете строку в свой сегмент кода. Однако, поскольку версия lodsb, по-видимому, работает, я предполагаю, что вы это предусмотрели.

И, из (по общему признанию, выцветшей) памяти, у 8086 есть инструкция inc si, которая может сэкономить небольшое количество места, не то чтобы это имело значение, но я был выкован в время, когда каждый байт посчитан : -)

First lodsb - это команда, которая говорит компьютеру получить символ в коде и увеличивает смещение. Смещение определяется [SI], регистром, который можно легко установить. Как только SI установлен, lodsb получает символ и помещает его в al. С этого момента его читают все и решают, что делать. Здесь есть еще один вопрос, подобный этому .