Эта инструкция копирует байт из порта ввода-вывода 41h в регистр AL
При втором способе можно использовать для ссылки на порт ввода-вывода, из которого нужно выполнить чтение, регистр DX:
Mov dx,41h ; загрузить число в регистр dx;
In al,dx ; загрузить содержимое внешнего устройства с адресом 41h в регистр al.
Регистр DX используется в качестве указателя порта ввода-вывода в двух случаях. Во-первых, если адрес порта ввода-вывода превышает 255, то необходимо использовать DX. Во-вторых, использование регистра DX позволяет при адресации к портам ввода-вывода получить большую гибкость. Например, указатель на порт ввода-вывода можно передать подпрограмме, загрузив его в регистр DX.
В указанных инструкциях регистры AL и AX являются единственно возможными операндами-приемниками. Аналогично, единственными допустимыми операндами-источниками являются регистр DX и значение-константа, меньшая 255.
Инструкция OUT в точности эквивалентна инструкции IN, только операндом-источником является регистр AL или AX, а порт ввода-вывода, на который указывает регистр DX или постоянное значение, меньшее 256, является операндом-приемником. Например, следующие инструкции устанавливают порт вывода 5а5h в значение 0Fh:
Mov dx,5а5h
Mov al,0fh
Out dx,al
Основные приемы программирования на ассемблере
Ассемблер, являясь языком низкого уровня, не содержит операторов ветвления, циклов, не поддерживает автоматического формирования адресов для структур данных, не обеспечивает автоматического выполнения преобразований при вводе-выводе данных. Все перечисленные операции программируются "вручную" с использованием имеющихся команд ассемблера.
Программирование ветвлений
Ветвления программируются с использованием команд условной и безусловной передачи управления.
Cmp ...
j<условие>else
<операции 1>
Jmp com
else: <операции 2>
com: <продолжение>
Пример.
Написать процедуру вычисления X=max(A,B):
Max proc near
Mov ax, A
cmp ax, B ; сравнение A и B
jl less; переход если меньше
Mov X, ax
jmp continue; переход на конец ветвления
less: mov ax, B
Mov X, ax
continue: ret
Max endp
Программирование циклических процессов.
Программирование циклических процессов осуществляется с использованием либо команд переходов, либо - в случае счетных циклов - с использованием команд организации циклов.
a) программирование итерационных циклов (цикл-пока):
сycl: cmp ...
Jne com
<операции>
Jmp cycl
com: ....
Пример.
Написать процедуру суммирования чисел от 1 до 10, используя итерационный цикл.
Sum proc near
mov ax, 0; обнуление суммы
mov bx, 1 ; первое слагаемое
cycl: cmp bx, 10; слагаемое больше 10
jg continue ; выход из цикла
add ax, bx; суммирование
inc bx ;следующее число
jmp cycl; возврат в цикл
continue: ret; выход, сумма - в ax
Sum endp
a) программирование счетных циклов:
Mov cx, N
cycl: <операции>
Loop cycl
com: .....
Пример.
Написать процедуру суммирования чисел от 1 до 10, используя счетный цикл.
Sum proc near
mov ax, 0; обнуление суммы
mov bx, 1 ; первое слагаемое
mov cx, 10; загрузка счетчика
cycl: add ax, bx; суммирование
inc bx ;следующее число
loop cycl; возврат в цикл
continue: ret; выход, сумма - в ax
Sum endp