Ассемблер пример простой программы

Простой пример обработки сообщения от мыши.
Для обработки сообщения от мыши в 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

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru