Лекция по программированию

Автор работы: Пользователь скрыл имя, 11 Января 2011 в 19:34, лекция

Краткое описание

Язык ассемблера - это один из самых старых из всех существующих языков программирования. Когда-то это был один из основных языков программирования, без знания которого нельзя было заставить компьютер сделать что-либо полезное. Появились более удобные средства общения с компьютером. Но в отличии от других языков ассемблер не умирал, более того он это не смог сделать в принципе.

Содержимое работы - 1 файл

LECTS.DOC

— 893.00 Кб (Скачать файл)

test источник, приемник -. операция проверить. Команда выполняет поразрядное логическую операцию И  Результат никуда не записывается. Изменяется состояние флагов Zf, sf и cf/

not операнд - операция логического отрицания. Поразрядное инвертирование каждого бита операнда. Результат записывается в операнд.

Команды сдвига

Общий формат этих команд

КОП операнд, счетчик_сдвигов

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

    Все команды сдвига делятся на команды:

Линейный  сдвиг

Осуществляется  сдвиг по следующей схеме:

  • Очередной «выдвигаемы й» бит устанавливается флаг cf
  • бит, вводимый в операнд с другого конца, имеет значение 0
  • при сдвиге очередного бита он переходит во флаг cf, при этом значение предыдущего сдвинутого бита теряется.

Команды линейного делятся на: команды логического сдвига команды арифметического сдвига.

К командам логического сдвига относятся

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 может вводить данные из разных устройств - файлов, последовательного порта, клавиатуры.

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

     При вызове функции 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 -    переслать один байт или одно слово из  одной  области  памяти  в  другую;

Информация о работе Лекция по программированию