Принципы работы ввода вывода на ассемблере — обзор, примеры, советы

Программирование ввода на ассемблере: считывание данных с внешних устройств

IN AL, 60h

Здесь AL — регистр, в который будет сохранено считанное значение, а 60h — номер порта клавиатуры. После выполнения данной команды в регистр AL будет записан ASCII-код нажатой клавиши.

Кроме команды IN, ввод данных может быть реализован с использованием прерываний. Например, прерывание INT 16h позволяет считывать символы с клавиатуры. После вызова данного прерывания в регистр AH будет сохранен код функции, а в регистр AL — считанный символ.

При программировании ввода данных на ассемблере необходимо учитывать особенности работы с конкретными устройствами и следовать их документации. Также важно обрабатывать возможные ошибки при вводе данных и предусматривать их коррекцию или обработку.

УстройствоПортПример команды
Монитор0x03C0OUT DX, AL
Принтер0x0378OUT DX, AL
Аудиосистема0x0220OUT DX, AL

Пример 1:


segment .data
prompt db 'Введите число: ', 0
output db 'Вы ввели число: ', 0
buffer db 10

segment .text
global _start

_start:
mov eax, 4
mov ebx, 1
mov ecx, prompt
mov edx, 13
int 0x80

; считываем число
mov eax, 3
mov ebx, 0
mov ecx, buffer
mov edx, 1
int 0x80

mov eax, 4
mov ebx, 1
mov ecx, output
mov edx, 17
int 0x80

; завершаем программу
mov eax, 1
xor ebx, ebx
int 0x80

Пример 2:

Данная программа запрашивает у пользователя свое имя и затем приветствует его:


segment .data
prompt db 'Введите свое имя: ', 0
greeting db 'Привет, ', 0
buffer db 32

segment .text
global _start

_start:
mov eax, 4
mov ebx, 1
mov ecx, prompt
mov edx, 20
int 0x80

; считываем имя
mov eax, 3
mov ebx, 0
mov ecx, buffer
mov edx, 32
int 0x80

mov eax, 4
mov ebx, 1
mov ecx, greeting
mov edx, 8
int 0x80

; завершаем программу
mov eax, 1
xor ebx, ebx
int 0x80

    Оцените статью