Найти в Дзене
Junior Coder

Ассемблер. Пример программы. Ищем "х" на экране.

Предлагаю попробовать написать программу на ассемблере. Все, что делает эта программа, прячет символ "х" на экране, а затем ищет его последовательно проверяя все символы на экране. Вроде немного, но эта программа поможет вам понять как организовать доступ к системному таймеру, организовать задержку и многое другое. Прерывание int 08h от системного таймера происходит примерно 18,2 раза в секунду, доступ к текущим значениям можно получить через прерывание int 1Ah. При этом в регистре CX хранятся старшие (большие) значения, а в регистре DX младшие. Нам понадобятся только те значения, которые находятся в DX. Команда логического сравнения AND, побитно сравнивает два значения, и работает так: 0+0=0 0+1=0 1+1=1 то есть наша маска 11111110b обнуляет младший бит числа, если число нечетное и превращает его в четное. Нам это нужно, чтобы регистр DI был нацелен на символ, а не на его атрибуты, как мы помним символы на экране хранятся в четных адресах, а их атрибуты в нечетных. 0 - это четное чис

Предлагаю попробовать написать программу на ассемблере. Все, что делает эта программа, прячет символ "х" на экране, а затем ищет его последовательно проверяя все символы на экране. Вроде немного, но эта программа поможет вам понять как организовать доступ к системному таймеру, организовать задержку и многое другое.

Прерывание int 08h от системного таймера происходит примерно 18,2 раза в секунду, доступ к текущим значениям можно получить через прерывание int 1Ah. При этом в регистре CX хранятся старшие (большие) значения, а в регистре DX младшие. Нам понадобятся только те значения, которые находятся в DX.

-2

Команда логического сравнения AND, побитно сравнивает два значения, и работает так:

0+0=0

0+1=0

1+1=1

то есть наша маска 11111110b обнуляет младший бит числа, если число нечетное и превращает его в четное. Нам это нужно, чтобы регистр DI был нацелен на символ, а не на его атрибуты, как мы помним символы на экране хранятся в четных адресах, а их атрибуты в нечетных. 0 - это четное число.

-3

Сохроняя значения в память, компьютер записывает их задом наперед (побайтно), поэтому записывая значение с помощью команды STOSW мы пишем в старшую часть регистра AX AH атрибуты символа, а в младшую AL, записываем сам символ. То же происходит, когда в строке

MOV DX,[ES:DI]

мы извлекаем значение из видеопамяти - символ сохроняется в младшей части регистра DX DL.

При делении больших чисел значение сохраняют в регистрах DX:AX делитель в любом другом регистре, после деления остаток формируется в регистре DX, а частное в AX, поэтому при делении в несколько циклов DX необходимо обнулять каждый раз.

Деление небольших чисел (16 бит) можно производить сохранив делимое в AX, остаток при этом формируется в AH, частное в AL, делитель можно поместить в любой неиспользуемый 8-битный регистр, например в BL.

-4

при переходе с помощью команды CALL в стеке сохраняется адрес возврата из подпрограммы, команды условных переходов типа JE, JNZ и др., этого не делают, здесь я показал, как можно самостоятельно организовать возвращение при помощи стека. Также можно было просто написать JMP CONT.

-5

Можно было сделать вложенный цикл, но я не стал заморачиваться и просто сделал два цикла задержки - не было желания подбирать подходящее значение для вложенного цикла.

-6

Здесь, думаю, все понятно из комментариев.

-7

тут тоже.

-8

Для компиляции воспользуйтесь FASM, для эмуляции DosBOX.

#ассемблер #примеры программ на ассемблере