@lutokris

Ассемблер, я правильно понимаю что по умолчанию в регистрах 0x00?

Всем добра. Пытаюсь учить ассемблер. Есть пример с двумя подпрограммами.

; library.asm
int 0x20

; отображаем на экране букву, которая записана в регистр AL( в ASCII коде)
display_letter:
push ax
push bx
push cx
push dx
push si
push di

mov ah, 0x0E ; код функции которая выводит букву на экран
mov bx, 0x000F ; 00 - нулевая страница; BL - цвет буквы
int 0x10 ; обращаемся к BIOS, чтобы она нарисовала букву

pop di
pop si
pop dx
pop cx
pop bx
pop ax

ret

; считывает символ с клавиатуры в ASCII коде и помещает его в AL
read_keyboard:
push bx
push cx
push dx
push si
push di

mov ah, 0x00 ; код функции считывающей символ с клавиатуры
int 0x16 ; обращаемся к BIOS чтобы выполнить ее

pop di
pop si
pop dx
pop cx
pop bx

ret

я еще не достиг изучения пуш,поп из стека, но примерно представляю что таким образом резервируют значения регистров которые изменяются в ходе выполнения подпрограммы. В подпрограмме display_letter регистр AX, BX зарезервировали, потому что они изменяются напрямую в ходе выполнения подпрограммы для вызова прерывания 0x10.
А вот в подпрограмме read_keyboard почему то не сохраняют регистр AX и сохраняют регистр BX который вроде напрямую не меняется в подпрограмме. А если принять к факту, что по умолчанию в регистрах хранится значение 0x00 и соответственно регистр AX не меняется, то зачем тогда нужно дополнительно записывать в AH 0x00 перед вызовом прерывания 0x16? я попробовал ничего не записывать в регистр AH и вызвать прерывание 0x16, значит по умолчанию в регистре 0x00. А вот почему сохранили регистр BX - я не понял, где он и как меняется.
  • Вопрос задан
  • 407 просмотров
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
А если принять к факту, что по умолчанию в регистрах хранится значение 0x00

Ничего в регистрах "по умолчанию" не хранится, кроме того, что в них в последний раз было записано.

я попробовал ничего не записывать в регистр AH и вызвать прерывание 0x16, значит по умолчанию в регистре 0x00.

Нет, это значит только то, что в этом месте твоей программы в этот раз в регистре AH был 0.

в подпрограмме read_keyboard почему то не сохраняют регистр AX

Потому что результат возвращают в нём.

почему сохранили регистр BX - я не понял

…а также cx, dx, si и di. При том, что функция 0 int 16 меняет только AX. Я думаю, что на всякий случай их сохранили, для надёжности.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
saboteur_kiev
@saboteur_kiev
software engineer
Нет, регистры используются разными процессами, ядром и так далее. Если ты их сам не обнулил, в них может быть что угодно
Ответ написан
Комментировать
@VitalyChaikin
Я рекомендую обязательно смотреть документацию, чтобы четко понимать какие регистры используют входные данные, и куда помещается результат.
push и pop в данном случае используются чтобы сохранить значения регистров, а затем восстановить их. Однако вызываемые функции НЕ ИСПОЛЬЗУЮТ эти регистры. И сохранение/восстановление не имеет никакого смысла.
int 10
0eH писать символ на активную видео страницу (эмуляция телетайпа)
вход: AL = записываемый символ (использует существующий атрибут)
BL = цвет переднего плана (для графических режимов)

display_letter:
mov ah, 0x0E ; код функции которая выводит букву на экран
mov bx, 0x000F ; 00 - нулевая страница; BL - цвет буквы
int 0x10 ; обращаемся к BIOS, чтобы она нарисовала букву

int 16
00H читать (ожидать) следующую нажатую клавишу
выход: AL = ASCII символ (если AL=0, AH содержит расширенный код ASCII )
AH = сканкод или расширенный код ASCII

read_keyboard:
mov ah, 0x00 ; код функции считывающей символ с клавиатуры
int 0x16 ; обращаемся к BIOS чтобы выполнить ее
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы