Получение строки для печати через прерывание 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 ответа:
Обычно не очень хорошая идея:
- предположим, что все регистры сохраняются при вызовах прерывания (или любых вызовах, на самом деле); или
- не настраиваются все необходимые регистры для данного вызова.
На этой первой ноте я бы поставил
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. С этого момента его читают все и решают, что делать. Здесь есть еще один вопрос, подобный этому .