Задать вопрос
@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 - я не понял, где он и как меняется.
  • Вопрос задан
  • 454 просмотра
Подписаться 1 Простой Комментировать
Ответ пользователя Saboteur К ответам на вопрос (3)
saboteur_kiev
@saboteur_kiev
software engineer
Нет, регистры используются разными процессами, ядром и так далее. Если ты их сам не обнулил, в них может быть что угодно
Ответ написан
Комментировать