Простой пример обработки сообщения от мыши.
Для обработки сообщения от мыши в DOS`е нам потребуется прерывание 33h.
int 33h Вход: ax =0000h Выход: ax =0000h, если мышь или драйвер мыши не установлены. ax =0ffffh, драйвер и мышь установлены. Bx=число кнопок: 0002 или 0ffffh – две 0003 – три 0000 – другое количество
int 33h Вход: ax=0001h Спрятать курсор: int 33h Вход: ax=0002h
int 33h Вход: ax=000сh es:dx = адрес обработчика cx = условие вызова бит 0: любое перемещение бит 1: нажатие левой копки бит 2: отпускание левой копки бит 3: нажатие правой копки бит 4: отпускание правой копки бит 5: нажатие средней копки бит 6: отпускание средней копки cx = 0000h – отменить обработчик
Обработчик оформляется как дальняя процедура, на входе ax — содержит условие вызова, bx – состояние кнопок, cx и dx – x и y координаты курсора, si и di – счетчик последнего перемещения по горизонтали и вертикали, ds – сегмент данных драйвера мыши.
Делать будем com программу, используя TASM, параметры транслятора и компоновщика такие:
#1 Первая программа на ассемблере MASM
bintasm mouse.asm bintlink /t /x mouse.obj /t – создать файл типа .com /x – не создавать файл карты(map) .model tiny ; код, данные и стек размещаются в одном сегменте, размером 64 кб .code ; основной сегмент кода org 100h ; счетчик для com start: mov ax,12h ;установка видеорежима 640х480, 16 цветов int 10h mov ax,0000h ;инициализация мыши int 33h mov ax,0ch ; установка обработчика мыши mov cx,0001h ; любое перемещение lea dx,handler_I ; смещение обработчика int 33h ;—————————————— mov ah,10h ; ждем нажатие любой кнопки int 16h mov ax,000ch mov cx,0000h ; отменяем обработчик int 33h ret ; конец программы handler_I: ; наш обработчик ; cx и dx – x и y координаты курсора, а для int 10h это номера строки и столбца push cs pop ds ; в ds сегмент кода и данные программы mov bh,0 ; номер видеостраницы mov ah,0ch ; вывести точку на экран mov al,color_m ; цвет точки int 10h retf ; выход из процедуры color_m db 0000010 end start
Здесь необходимо заметить, что в режиме 12h возвращаемые координаты совпадают с координатами пикселов. Если использовать режим 13h, то необходимо координату X разделить на 2. Программу можно оптимизировать, необходимо в обработчике мыши использовать прямую запись в видеопамять вместо прерывания 10h.
Массивы на Ассемблере
Создание одномерного массива на Ассемблере.
.model tiny .code org 100h start: push cs pop ds ;————————————— mov cx,99 ;Значение счетчика циклов для команды loop mov si,0 ;Индекс первого элемента, si так же будет и значением ARR_loop: mov array[si],si;array[0]=0,array[1]=1. array[n]=n inc si loop ARR_loop ;цикл int 20h ;————————————— array dw 99 dup (?) ;Не инициализированный массив end start
Создание двухмерного массива на Ассемблере.
.model tiny .code org 100h start: push cs pop ds ;в сегмент данных заносим сегмент кода mov si,0 ;Начальная строка mov bx,0 ;Начальный столбец ;————————————— array_loop: mov array[bx][si],bx ;Заполняем элементы массива текущим индексом столбца inc si ;На следующий элемент строки cmp si,10 ;Конец строки? jz NextLine ;если да, переходим на метку NextLine jmp array_loop ;иначе, продолжаем заполнять строку NextLine: mov si,0 ;Обнуляем индекс элемента строки inc bx ;Переходим на следующий столбец cmp bx,10 ;Последний столбец? jz exit ;если да,выход jmp array_loop ;иначе, продолжаем заполнять следующею строку exit: ;————————————— int 20h ;Выход из com программы ;————————————— array dw 10 dup (10 dup (?)) end start
Поиск числа в двухмерном массиве на Ассемблере.
Assembler — простая программа
.model tiny .code org 100h start: push cs pop ds ;в сегмент данных заносим сегмент кода mov si,0 mov bx,0 ;Поиск———————————- array_find: mov ax,array[bx][si] call Proverka inc si ;На следующий элемент строки cmp si,2 ;Конец строки? jz NLine ;если да, переходим на метку NextLine jmp array_find ;иначе, продолжаем заполнять строку NLine: mov si,0 ;Обнуляем индекс элемента строки inc bx ;Переходим на следующий столбец cmp bx,3 ;Последний столбец? jz exit ;если да,выход jmp array_find ;иначе, продолжаем заполнять следующею строку exit: ;————————————— int 20h ;Выход из com программы ;————————————— array dw 2 dup (3 dup (0)) message db «Yes «,0dh,0ah,’$’ ;————————————— Proverka proc cmp ax,0 jz YES ret YES: mov ah,9 mov dx,offset message int 21h ret Proverka endp end start
Пример расчета факториала на Ассемблере.
Пример расчета факториала, на мой взгляд, очень полезная программа для понимания работы стека.
Прямая запись в видео память на ассемблере.
Рисование горизонтальной линии, с помощью прямой записи в видео память.
.model tiny .code org 100h start: mov al,13h int 10h mov ax,0A000h mov es,ax mov dx,320*100+160 ;320*y1+x1(начальная точка) mov cx,13 ;Длина линии call gline mov ah,10h int 16h ret ;———————————————————— gline proc mov di,dx mov al,111b ;color rep stosb ;копируем al в ES:DI, dec DI ret gline endp ;———————————————————— end start
Вывод ASCII кодов на ассемблере.
.model tiny .code org 100h start: mov ax,13h int 10h mov cx,256 ;Счетчик кругов для loop mov ax,0003h ;Установка видеорижима 3, курсор в 0,0 int 10h ;и очистка экрана mov ax,0b800h mov es,ax ;Загружаем в дополнительный сегментный регистр абсол.адрес mov di,0 ;Смещение относительно адреса 0b800h mov ah,010b ;Атрибуты, цвет текста зеленый mov al,00h ;ASCII код mov es:[di],ax ;Грузим не в регистр а по адресу который наход. в регистре ;———————- cloop: add di,4 ;Смещение на 4 байта, чтобы выглядело нормально inc al ;Следущий ASCII код mov es:[di],ax ;Грузим по адресу в видеопамять loop cloop ;Дальше. ;———————- mov ah,10h ;Ждем нажатие Any Key int 16h ret end start
Источник: blagin.ru
Пример простейшей программы на ассемблере
Ниже приведен исходный текст полностью законченной программы на ассемблере, выполняющей некоторые арифметические операции.
CODE SEGMENT ; (1) определение программного сегмента
ASSUME DS:CODE ; (2)
Start: ; (4) точка входа в программу
MOV AX, a ; (3) запись в AX значения переменной a
MOV BX, b ; (4) запись в BX значения переменной b
IMUL BX ; (5) умножение AX на BX
ADD AX, c ; (6) добавление к переменной c значения
MOV d, AX ; (8) запись значения AX в переменную d
MOV AX, 4C00h ; (9) запись в AH номера функции DOS
INT 21h ; (10) вызов функции DOS завершения
a DW 5 ; (12) определение переменной a
b DW -7 ; (13) определение переменной b
c DW 120 ; (14) определение переменной c
d DW ? ; (15) определение переменной d
CODE ENDS ; (16) конец программного сегмента
END Start ; (17) определение точки входа в программу
Программа выполняет вычисление значения выражения a * b + c и записывает результат в переменную d. После этого происходит завершение программы и передача управления операционной системе.
В строке 1 определяется программный сегмент с именем “CODE”, в котором находятся команды программы и данные (переменные a, b, c, d).
В строке 2 с помощью директивы ASSUME определяется, что при обращении к переменным программы будет использоваться сегментный регистр DS.
В строке 3 в регистр AX записывается значение из переменной a, т. е. в регистр AX записывается число 5.
В строке 4 в регистр BX записывается значение из переменной b, т. е. в регистр BX записывается число -7.
В строке 5 значение регистра AX умножается на значение регистра BX и результат записывается в так называемую регистровую пару DX:AX, т. е. в регистр DX записывается старшая часть произведения двух 16-битных регистров (биты 16 – 31), а в регистр AX записывается младшая часть произведения (биты 0 – 15). При умножении операнды рассматриваются как числа со знаком.
В строке 6 к младшей части произведения добавляется значение переменной c, т. е. значение регистра AX увеличивается на 120.
В строке 8 значение регистра AX записывается в переменную d, т. е. в переменную d записывается значение выражения 5 * (-7) + 120.
В строке 9 в регистр AH записывается номер функции DOS завершения программы 4Ch, а в регистр AL записывается код возврата 00h.
В строке 10 вызывается функция DOS, номер которой был записан в регистре AH – это функция завершения программы и передачи управления операционной системе. После выполнения этой команды работа программы завершается.
В строках 12 – 15 определяются переменные a, b, c, d и их начальные значения. Переменная d не инициализируется, так как в нее записывается результат.
В строке 16 директивой ENDS закрывается программный сегмент с именем “CODE”.
В строке 17 директивой END транслятору указывается точка входа в программу, на чем текст программы завершается.
В правой части программы к каждой строке подписаны комментарии. Комментарий в языке ассемблера начинается с символа ‘;’ и продолжается до конца текущей строки.
Для выполнения лабораторной работы необходимо:
- открыть любой текстовый редактор (например, встроенный в программу-оболочку Norton Commander) и набрать текст программы на ассемблере. При наборе текста программы можно использовать следующий шаблон:
- Значения четырех переменных (a, b,c и d), участвующих в выражении, необходимо занести в четыре регистра общего назначения, например, AX, BX, CX и DX с использованием команды MOV. Значения переменных могут быть любыми, но среди них должны быть как положительные, так и отрицательные числа.
- Оттранслировать программу с использованием транслятора Turbo Assembler. Для этого необходимо ввести в командной строке DOS следующую команду: TASM.EXE , где имя_программы – имя файла программы с расширением .ASM, например «MyProg.asm».
- Если в процессе трансляции транслятором были выданы ошибки, необходимо исправить текст программы и провести повторную трансляцию. В случае успешной трансляции в текущей директории должен появиться объектный файл с именем программы и расширением .OBJ, например «MyProg.obj».
- Скомпоновать программу как COM, используя компоновщик Turbo Linker. Для этого необходимо ввести в командной строке DOS следующую команду: TLINK.EXE /t , где имя_ объектного_файла – имя объектного файла программы с расширением .OBJ, например «MyProg.obj».
- Если в процессе компоновки компоновщиком были выданы ошибки, необходимо исправить текст программы и провести повторную трансляцию и компоновку. В случае успешной компоновки в текущей директории должен появиться исполнительный файл с именем программы и расширением .COM, например «MyProg.com».
- Загрузить программу в отладчик. Для этого необходимо ввести в командной строке DOS следующую команду: TD.EXE , где имя_исполнительного_файла – имя исполнительного файла программы с расширением .COM, например «MyProg.com».
- Проверить работу программы в пошаговом режиме. Для выполнения программы в пошаговом режиме используется клавиша F7. При этом при каждом нажатии клавиши F7 выполняется очередная команда программы. Для возвращения программы в исходное состояние нужно нажать комбинацию клавиш Ctrl+F12.
- При контроле правильности работы программы после выполнения каждой команды требуется сверять результаты выполнения арифметических операций с тем, что должно получиться в результате выполнения конкретной арифметической операции.
Источник: studfile.net
Пример простейшей программы на ассемблере
Ниже приведен исходный текст полностью законченной программы на ассемблере, выполняющей некоторые арифметические операции.
CODE SEGMENT ; (1) определение программного сегмента
ASSUME DS:CODE ; (2)
Start: ; (4) точка входа в программу
MOV AX, a ; (3) запись в AX значения переменной a
MOV BX, b ; (4) запись в BX значения переменной b
IMUL BX ; (5) умножение AX на BX
ADD AX, c ; (6) добавление к переменной c значения
MOV d, AX ; (8) запись значения AX в переменную d
MOV AX, 4C00h ; (9) запись в AH номера функции DOS
INT 21h ; (10) вызов функции DOS завершения
a DW 5 ; (12) определение переменной a
b DW -7 ; (13) определение переменной b
c DW 120 ; (14) определение переменной c
d DW ? ; (15) определение переменной d
CODE ENDS ; (16) конец программного сегмента
END Start ; (17) определение точки входа в программу
Программа выполняет вычисление значения выражения a * b + c и записывает результат в переменную d. После этого происходит завершение программы и передача управления операционной системе.
В строке 1 определяется программный сегмент с именем “CODE”, в котором находятся команды программы и данные (переменные a, b, c, d).
В строке 2 с помощью директивы ASSUME определяется, что при обращении к переменным программы будет использоваться сегментный регистр DS.
В строке 3 в регистр AX записывается значение из переменной a, т. е. в регистр AX записывается число 5.
В строке 4 в регистр BX записывается значение из переменной b, т. е. в регистр BX записывается число -7.
В строке 5 значение регистра AX умножается на значение регистра BX и результат записывается в так называемую регистровую пару DX:AX, т. е. в регистр DX записывается старшая часть произведения двух 16-битных регистров (биты 16 – 31), а в регистр AX записывается младшая часть произведения (биты 0 – 15). При умножении операнды рассматриваются как числа со знаком.
В строке 6 к младшей части произведения добавляется значение переменной c, т. е. значение регистра AX увеличивается на 120.
В строке 8 значение регистра AX записывается в переменную d, т. е. в переменную d записывается значение выражения 5 * (-7) + 120.
В строке 9 в регистр AH записывается номер функции DOS завершения программы 4Ch, а в регистр AL записывается код возврата 00h.
В строке 10 вызывается функция DOS, номер которой был записан в регистре AH – это функция завершения программы и передачи управления операционной системе. После выполнения этой команды работа программы завершается.
В строках 12 – 15 определяются переменные a, b, c, d и их начальные значения. Переменная d не инициализируется, так как в нее записывается результат.
В строке 16 директивой ENDS закрывается программный сегмент с именем “CODE”.
В строке 17 директивой END транслятору указывается точка входа в программу, на чем текст программы завершается.
В правой части программы к каждой строке подписаны комментарии. Комментарий в языке ассемблера начинается с символа ‘;’ и продолжается до конца текущей строки.
Для выполнения лабораторной работы необходимо:
· открыть любой текстовый редактор (например, встроенный в программу-оболочку Norton Commander) и набрать текст программы на ассемблере. При наборе текста программы можно использовать следующий шаблон:
После метки Start и до конца сегмента команд размещаются арифметические команды, необходимые для вычисления значения выражения.
· Значения четырех переменных (a, b,c и d), участвующих в выражении, необходимо занести в четыре регистра общего назначения, например, AX, BX, CX и DX с использованием команды MOV. Значения переменных могут быть любыми, но среди них должны быть как положительные, так и отрицательные числа.
· Оттранслировать программу с использованием транслятора Turbo Assembler. Для этого необходимо ввести в командной строке DOS следующую команду: TASM.EXE , где имя_программы – имя файла программы с расширением .ASM, например «MyProg.asm».
· Если в процессе трансляции транслятором были выданы ошибки, необходимо исправить текст программы и провести повторную трансляцию. В случае успешной трансляции в текущей директории должен появиться объектный файл с именем программы и расширением .OBJ, например «MyProg.obj».
· Скомпоновать программу как COM, используя компоновщик Turbo Linker. Для этого необходимо ввести в командной строке DOS следующую команду:
TLINK.EXE /t ,
где имя_ объектного_файла – имя объектного файла программы с расширением .OBJ, например «MyProg.obj».
· Если в процессе компоновки компоновщиком были выданы ошибки, необходимо исправить текст программы и провести повторную трансляцию и компоновку. В случае успешной компоновки в текущей директории должен появиться исполнительный файл с именем программы и расширением .COM, например «MyProg.com».
· Загрузить программу в отладчик. Для этого необходимо ввести в командной строке DOS следующую команду:
TD.EXE ,
где имя_исполнительного_файла – имя исполнительного файла программы с расширением .COM, например «MyProg.com».
· Проверить работу программы в пошаговом режиме. Для выполнения программы в пошаговом режиме используется клавиша F7. При этом при каждом нажатии клавиши F7 выполняется очередная команда программы. Для возвращения программы в исходное состояние нужно нажать комбинацию клавиш Ctrl+F12.
· При контроле правильности работы программы после выполнения каждой команды требуется сверять результаты выполнения арифметических операций с тем, что должно получиться в результате выполнения конкретной арифметической операции.
Правильность работы программы необходимо проверить для нескольких значений переменных a, b, c и d. При этом каждый раз при изменении значений переменных в программе необходимо выполнять трансляцию и компоновку программы.
Источник: megapredmet.ru