Ассемблер, я правильно понимаю что по умолчанию в регистрах 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 - я не понял, где он и как меняется.