Автор работы: Пользователь скрыл имя, 11 Января 2011 в 19:34, лекция
Язык ассемблера - это один из самых старых из всех существующих языков программирования. Когда-то это был один из основных языков программирования, без знания которого нельзя было заставить компьютер сделать что-либо полезное. Появились более удобные средства общения с компьютером. Но в отличии от других языков ассемблер не умирал, более того он это не смог сделать в принципе.
test источник, приемник -. операция проверить. Команда выполняет поразрядное логическую операцию И Результат никуда не записывается. Изменяется состояние флагов Zf, sf и cf/
not операнд - операция логического отрицания. Поразрядное инвертирование каждого бита операнда. Результат записывается в операнд.
Команды сдвига
Общий формат этих команд
КОП операнд, счетчик_сдвигов
Команды этой группы обеспечивают манипуляции над отдельными битами операндов, но иным способом, чем логически команды, рассмотренные выше. Все команды сдвига помещают биты в поле операнда влево или вправо, в зависимости кода операции.
Все команды сдвига делятся на команды:
Линейный сдвиг
Осуществляется сдвиг по следующей схеме:
Команды линейного делятся на: команды логического сдвига команды арифметического сдвига.
К командам логического сдвига относятся
shl операнд, счетчик_сдвигов - логический сдвиг влево. Содержимое операнда сдвигается влево на количество битов, определяемое значением счетчика_сдвигов. Справа (в позицию младшего бита) вписываются нули
shr операнд, счетчик_сдвигов — логический сдвиг вправо. Содержимое операнда сдвигается вправо на количество битов, определяемое значением счетчика_сдвигов. Слева (в позицию старшего бита) вписываются нули
shl ah,4
Команды
арифметического линейного
sal операнд, счетчик_сдвигов — арифметический сдвиг влево. Содержимое операнда сдвигается влево на количество битов, определяемое значением счетчика_сдвигов. Справа (в позицию младшего бита) вписываются нули. Команда sal не сохраняет знака, но устанавливает флаг cf в случае смены знака очередным выдвигаемым битом.
Команда сравнения
Команда CMP, ; которая обычно используется для изменения состояния флагов, на основании которых команды передачи управления «принимают решение» передавать или не передавать управление.
Подобно команде SUB команда CMP вычитает операнд-источник из операнда-приемника и в зависимости от результата устанавливает или обнуляет флаги. Но в отличии от команды SUB команда CMP не сохраняет результат вычитания, т.е. не изменяет операнды.
Формат команды
СМР
операнд1, операнд2
Перечень команд
условного перехода для команды
cmp операнд_1, операнд_2
Типы операндов | Мнемокод команды условного перехода | Критерий условного перехода | Значения флагов для осуществления перехода |
Любые | je | операнд_1= операнд_2 | zf=1 |
Любые | jne | операнд_1<> операнд_2 | zf=0 |
Со знаком | jl/jnge | операнд_1< операнд_2 | sf<>of |
Со знаком | jle/jng | операнд_1<= операнд_2 | sf<>of or zf=1 |
Со знаком | jg/jnle | операнд_1> операнд_2 | sf=of and zf=0 |
Со знаком | jge/jnl | операнд_1>= операнд_2 | sf=of |
Без знака | jb/jnae | операнд_1< операнд_2 | cf=1 |
Без знака | jbe/jna | операнд_1<= операнд_2 | cf=1 or zf=1 |
Без знака | ja/jnbe | операнд_1> операнд_2 | cf=0 and zf=0 |
Без знака | jae/jnb | операнд_1>= операнд_2 | cf=0 |
Ввод-вывод
строки
Использовать базовые DOS для ввода и вывода строк крайне неудобно т.к. они обеспечивают только посимвольную обработку данных. И для ввода с клавиатуры одной строки нам пришлось бы организовывать цикл. Существует более эффективные способы обработки строк.
Рассмотрим
пример использования команд условных
переходов для обработки символов. Пусть
мы вводим с клавиатуры некоторую строку
символов (например, имя файла), и хотим,
чтобы в программе эта строка была записана
прописными буквами, независимо от того,
какие буквы использовались при ее вводе.
Между прочим, при вводе с клавиатуры команд
DOS система всегда выполняет эту операцию,
поэтому и команды, и ключи, и имена файлов
можно вводить как прописными, так и строчными
буквами - DOS во всех случаях преобразует
все буквы в прописные.
code segment
assume cs:code, ds:data
main proc
mov ax,data ;Инициализируем
mov ds,ax ;регистр DS
;Выведем служебное сообщение
mov ah,09h ;Функция вывода
mov dx,offset msg ;адрес сообщения
int 21h
;Поставим запрос к DOS на ввод строки
mov ah,3Fh ;функция ввода
mov bx,0 ;дескриптор клавиатуры
mov cx,80 ;ввод максимум 80 байт
mov dx,offset buf ;адрес буфера ввода
int 21h
mov actlen,ax ;фактически введено
;Превратим строчные русские буквы в прописные
mov cx,actlen ;длина введенной строки
mov si,0 ;указатель в буфере
filter: mov al,buf[si] ;возьмем символ
cmp al,'а' ;меньше «а»?
jb noletter ;да, не преобразовывать
cmp al,'я' ;Больше «я»?
ja noletter ;да, не преобразовывать
cmp al,'п' ;больше «п»?
ja more ;да, на дальнейшую программу
sub al,20h ;«а»..«п». преобразуем в прописную букву
jmp store ;на сохранение в буфер
more: cmp al,'р' ;меньше «р»(псевдографика)?
jb noletter ;>п,<р не изменять
sub al,50h ; «р»..«я». Преобразуем в прописную букву
store: mov buf[si],al ;отправим назад в buf
noletter: inc si ;сместим указатель
loop filter ;цикл по всем символам
;Выведем результат преобразования на экран
mov ah,40h ;функция ввода
mov bx,1 ;дескриптор экрана
moc cx,actlen ;длина сообщения
mov dx,offset buf ;адрес сообщения
int 21h
mov ah,01 ;остановим программу
int 21h ;в ожидании нажатия клавиши
;Завершим программу
mov ax4C00h
int 21h
main endp
code ends
data segment
msg db 'Вводите! $'
buf db 80 dup(' ')
actlen dw 0
data ends
stk segment stack
dw 128 dup (?)
stk ends
end main
В начале программы на экран выводится служебное сообщение "Вводите!", которое служит запросом программы, адресованным пользователю. Далее с помощью функции DOS 3Fh выполняется ввод строки текста с клавиатуры. Функция 3Fh может вводить данные из разных устройств - файлов, последовательного порта, клавиатуры.
Различные
устройства идентифицируются их дескрипторами.
При работе с файлами дескриптор
каждого файла создается
При вызове функции 3Fh в регистр ВХ следует занести требуемый дескриптор, в регистр DX - адрес области в программе, выделенной для приема вводимых с клавиатуры символов, а в регистр СХ - максимальное число вводимых символов. Мы считаем, что пользователь не будет вводить более 80 символов. Можно ввести и меньше; в любом случае ввод строки следует завершить нажатием клавиши <Enter>. Функция 3Fh, отработав, вернет в регистре АХ реальное число введенных символов (включая коды 13 и 10, образуемые при нажатии клавиши <Enter>). В примере 3.5 число введенных символов сохраняется в ячейке actlen с целью использования далее по ходу программы.
Далее в цикле из actlen шагов выполняется анализ каждого введенного символа путем сравнения с границами диапазонов строчных русских букв. Русские строчные буквы размещаются в двух диапазонах кодов ASCII (а...п и р...с), причем для преобразования в прописные букв первого диапазона их код следует уменьшать на 20h, а для преобразования букв второго диапазона - на 50h. Поэтому анализ проводится с помощью четырех команд сравнения сmр и соответствующих команд условных переходов. Модифицированный символ записывается на то же место в буфере buf.
После завершения анализа и преобразования введенных символов, выполняется контрольный вывод содержимого buf на экран. Поскольку мы заранее не знаем, сколько символов будет введено, вывод на экран осуществляется функцией 40h, среди параметров которой указывается число выводимых символов. Так же, как и в случае функции ввода 3Fh, для функции вывода 40h в регистре ВХ необходимо указать дескриптор устройства ввода, в данном случае экрана, а в регистре DX - адрес выводимой строки.
Лекция(8,9,10). Команды обработки строк
Цель: Объяснить назначение специальных цепочечных команд, используемых для обработки символьных данных.
Для обработки строковых данных ассемблер имеет пять команд обработки строк:
MOVS - переслать один байт или одно слово из одной области памяти в другую;