Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Арифметические операции над целыми двоичными числами
Сложение двоичных чисел incоперанд - операция инкремента, то есть увеличения значения операнда на 1; inc ax; ax:=ax+1 inc x1; х1:=х1+1 addоп1,оп2 - команда сложения с принципом действия: оп1 = оп1 + оп2 (addition) add al, bl add ax, 0fe2h add ebx, x1+2 add x1, 0fh add x2, ax adcоп1,оп2 - команда сложения с учетом флага переноса cf. оп1 = оп1 + оп2 + знач_cf Вычитание двоичных чисел decоперанд — операция декремента, то есть уменьшения значения операнда на 1; dec cx ;cx:=cx-1 dec x subоперанд_1,операнд_2 — команда вычитания; ее принцип действия: операнд_1 = операнд_1 – операнд_2 sub al, bl; al:=al-bl sub ax, x1 sub x2, dx sub eax, 0f35h sub x2, 22h sbbоперанд_1,операнд_2 — команда вычитания с учетом заема (флага cf): операнд_1 = операнд_1 – операнд_2 – значение_cf Пример 6. Сложение двух однобайтных чисел. model small. stack 100 h. data x1 db 0c2h;первое слагаемоеx2 db 022h;второе слагаемоеy db ? ;результат. code start: mov ax,@ data mov ds, ax mov al, x1;помещаем в al первое слагаемоеadd al, x2;складываем х1 и х2mov y, al;помещаем результат на место mov ax,4c00h int 21hEnd start
Умножение двоичных чисел mul множитель_1 - операция умножения двух целых чисел без учета знака Алгоритм работы: Команда выполняет умножение двух операндов без учета знаков. Алгоритм зависит от формата операнда команды и требует явного указания местоположения только одного сомножителя, который может быть расположен в памяти или в регистре. Местоположение второго сомножителя фиксировано и зависит от размера первого сомножителя. Местоположение результата также зависит от размера первого сомножителя.
mul dl; ax:=al*dl, dl- множитель_1, al- множитель_2 mul x1; dx:ax=ax*0ad91h, x1 word- множитель_1, ax- множитель_2 mul ecx; edx:eax=eax*ecx, ecx- множитель_1, eax- множитель_2
в результате умножения может возникнуть ситуация когда результат по размеру превысит 16 или 32 бита, тогда старшая часть результата умножения заноситься в dx или edx соответственно. imulмножитель_1 - операция умножения двух целочисленных двоичных значений со знаком Деление двоичных чисел divделитель - выполнение операции деления двух двоичных беззнаковых значений Алгоритм работы: Для команды необходимо задание двух операндов — делимого и делителя. Делимое задается неявно, и размер его зависит от размера делителя, который указывается в команде. Расположение результата зависит от размера делителя.
div dl ;ah:al=ax/dl, ax –делимое, dl- делитель, ah-частное, al -остаток div x1 ;ax:dx=dx:ax/0ad91h, dx:ax –делимое, x1 word- делитель, ;ax-частное, dx -остаток div ecx ;eax:edx=edx:eax/ecx, edx:eax –делимое, ecx- делитель, ;eax-частное, edx -остаток
idivделитель - операция деления двух двоичных значений со знаком
Пример 7. Умножение двух однобайтных чисел. model small.stack 100h.data x1 db 78 ;первый множительyl db ? ;первый байт результатаyh db ? ;второй байт результата. code start: mov ax,@ data mov ds, ax xor ax, ax;очищаем регистр axmov al, 25;помещаем в al второй сомножительmul x1jnc m1 ;если нет переполнения, переходим на метку m1mov yh,ah;иначе старший байт результата помещаем в yhm1:mov yl, al;результат помещаем на место mov ax,4c00h int 21hEnd start
Пример 8. Деление двух однобайтных чисел. model small.stack 100h.data x1 db 6 ;делительyl db ? ;остатокyh db ? ;частное. code start: mov ax,@ data mov ds, ax xor ax, ax;очищаем регистр axmov ax, 25;помещаем в al делимоеdiv x1mov yh,ah;помещаем частное на местоmov yl, al;помещаем остаток на место mov ax,4c00h int 21hEnd start ASCII коды и их интепритация Ввод информации с клавиатуры и вывод ее на экран осуществляется в символьном виде, т.е. любой символ предоставляется в ASCII кодах. Причем на один символ идет один ASCII код. На два символа – два ASCII кода, и т.д. Любое число, вводимое с клавиатуры и выводимое на экран, представляется последовательностью ASCII кодов. Табл.1. ASCII коды цифр
Рассмотрим последовательность действий для преобразования чисел в их ASCII код и наоборот.
Ввод информации с клавиатуры: 1. Ввод символа с клавиатуры, один ASCII код находится в dl. Заранее не известно, что это за число от 0 до 9 или от а до f. Cmp dl, 040h Jb m1; если ASCII код меньше 40h значит ввели цифру от 0 до 9, ;переходим на метку m1 Cmp dl, 047h; иначе ввели букву, заглавную или маленькую? Jb m2;если ввели заглавную, переходим на m2, иначе выполняем ;дальше по программе sub dl, 057h;в dl получаем из символов число a..f h jmp m3;переходим на m3 чтобы не выполнять лишних вычислений m2: sub dl, 037h;в dl получаем из символов число a..f h jmp m3 m1: sub dl, 030h;в dl получаем из символов число 0..9 h m3: Далее приведен оптимизированный код преобразования числа из ASCII кодов. Подумайте в чем разница. Cmp dl,040h Jb m1 Cmp dl,047h Jb m2 Sub dl, 020h m2: sub dl, 07h m1: sub dl, 030h 2. Ввод строки, отличается только тем, что такое сравнение надо проводить с каждым элементом, т.е. надо организовать цикл и обращение к каждому элементу. Рассмотрим позднее. Вывод информации на экран
;двузначное число которое хотим вывести находится в bl mov dl, bl; помещаем число в регистр dl ;сдвигаем содержимое dl на 4 бита вправо, чтобы получить отдельно десятки shr dl, 4 and bl, 0fh ;получаем отдельно единицы cmp dl, 0ah ;сравниваем dl с ah jb m1;если меньше переходим на m1 add dl, 07h m1: add dl, 30h mov ah, 02hint 21h mov dl, bl cmp dl, 0ah ;сравниваем dl с ah jb m2 add dl, 07h m2: add dl, 30h int 21h Попробуйте сами разобраться в приведенном кусочке кода.
Команды передачи управления По принципу действия, команды микропроцессора, обеспечивающие организацию переходов в программе, можно разделить на три группы: 1. Команды безусловной передачи управления: - команда безусловного перехода; jmp - вызова процедуры и возврата из процедуры; call, ret - вызова программных прерываний и возврата из программных прерываний. Int, iret 2. Команды условной передачи управления: - команды перехода по результату команды сравнения cmp; - команды перехода по состоянию определенного флага; - команды перехода по содержимому регистра ecx/cx. 3. Команды управления циклом: - команда организации цикла со счетчиком ecx/cx; - команда организации цикла со счетчиком ecx/cx с возможностью досрочного выхода из цикла по дополнительному условию. jmp адрес_перехода - безусловный переход без сохранения информации о точке возврата. Аналог goto.
Условные переходы Команды условного перехода имеют одинаковый синтаксис: jcc метка_перехода Мнемокод всех команд начинается с “ j ” — от слова jump (прыжок), cc — определяет конкретное условие, анализируемое командой. Что касается операнда метка_перехода, то эта метка может находится только в пределах текущего сегмента кода, межсегментная передача управления в условных переходах не допускается. Для того чтобы принять решение о том, куда будет передано управление командой условного перехода, предварительно должно быть сформировано условие, на основании которого и будет приниматься решение о передаче управления. Источниками такого условия могут быть:
- любая команда, изменяющая состояние арифметических флагов; - команда сравнения cmp, сравнивающая значения двух операндов; - состояние регистра ecx/cx.
jcxz метка_перехода (Jump if cx is Zero) — переход, если cx ноль; jecxz метка_перехода (Jump Equal ecx Zero) — переход, если ecx ноль.
Условные переходы по содержимому флагов
Пример 9. Определите, равны ли два числа вводимые пользователем с клавиатуры. Определить равенство чисел можно используя вычитание, если разность исследуемых чисел равна 0, то они равны. Model small Stack 100h Data s1 db 'числа равны$' s2 db 'числа не равны$' .code start: mov ax,@data mov ds,ax mov ah,01h int 21h;ввели первое число mov dl,al;посылаем в dl первое число int 21h;ввели второе число sub al,dl;сравнили числа jnz m1;если получили не 0 результат, то на метку m1 mov dx, offset s1;иначе выводим строку s1, о том что числа равны. jmp m2 m1: mov dx, offset s2 ;числа не равны, выводим строку s2 m2: mov ah,09h int 21h;вывод информационную строку Mov ax,4c00h Int 21h End start
Команда сравнения cmp cmp операнд_1,операнд_2 - сравнивает два операнда и по результатам сравнения устанавливает флаги. Команда сравнения cmp имеет интересный принцип работы. Он абсолютно такой же, как и у команды вычитания sub. Единственное, чего она не делает — это запись результата вычитания на место первого операнда. Алгоритм работы: -выполнить вычитание (операнд1-операнд2); -в зависимости от результата установить флаги, операнд1 и операнд2 не изменять (то есть результат не запоминать).
Условные переходы после команд сравнения
Пример 10. Определите, равны ли два числа вводимые пользователем с клавиатуры. Model small Stack 100h Data s1 db 'числа равны$' s2 db 'числа не равны$' .code start: mov ax,@data mov ds,ax mov ah,01h int 21h;ввели первое число mov dl,al mov ah,01h int 21h;ввели второе число cmp al,dl;сравнили числа jne m1 mov dx, offset s1 jmp m2 m1: mov dx, offset s2 m2: mov ah,09h int 21h;вывод информационную строку Mov ax,4c00h Int 21h end start
Пример 11. Даны три числа, найти среди них максимальное. Model small Stack 100h Data s1 db 'максимальное число',10,13,'$' x1 db 34 x2 db 56 x3 db 45 .code start: mov ax,@data mov ds,ax mov dx, offset s1 mov ah,09h int 21h;вывод информационную строку ;находим максимальное число mov dl,x1;dl:=x1 cmp dl,x2;сравниваем х1 и х2 ja m1;если х1>х2, то на m1 mov dl,x2;иначе dl:=x2 m1: cmp dl,x3;сравниваем dl и х2 ja m2;если dl>х3 то на m2 mov dl,x3 ;в dl находится самый максимальный элемент m2: mov ah,02h int 21h;выводим максимальный элемент Mov ax,4c00h Int 21h End start
Организация циклов loop метка_перехода (Loop) — повторить цикл Работа команды заключается в выполнении следующих действий: - декремента регистра ecx/cx; - сравнения регистра ecx/cx с нулем: - если (ecx/cx) > 0, то управление передается на метку перехода; - если (ecx/cx) = 0, то управление передается на следующую после loop команду Организация цикла: mov cx, количество циклов м1: тело цикла loop m1 loope/loopz метка_перехода (Loop till cx <> 0 or Zero Flag = 0) — повторить цикл, пока cx <> 0 или zf = 0. loopne/loopnz метка_перехода (Loop till cx <> 0 or Not Zero flag=0) — повторить цикл пока cx <> 0 или zf = 1 Недостаток команд организации цикла loop, loope/loopz и loopne/loopnz в том, что они реализуют только короткие переходы (от –128 до +127 байт). Организация вложенных циклов: mov cх,n; в сх заносим количество итераций внешнего цикла m1: push cx … mov cx,n1; в сх заносим количество итераций внутреннего цикла m2: тело внутреннего цикла loop m2 … pop cx loop m1 Пример 12. Напишите программу подсчета у=1+2+3+…+n, n не более 10000.
model small .stack 100h .data yb dd? ym dw? s1 db 'введите n',10,13,'$' .code start: mov ax,@data mov ds,ax mov dx, offset s1 mov ah,09h int 21h
mov cx,3 m: shl bx,4 mov ah,01h int 21h вводим n в регистр bx sub ax,130h add bx,ax loop m
mov cx,bx xor dx,dx xor al,al m1: add dx,cx считаем у jnc m2 mov al,1 m2: loop m1
cmp al,1 je m3 mov ym,dx m3: mov yb,edx mov ax,4c00h int 21h End start
Команды обработки строк
Цепочка – это последовательность элементов, размер которых может быть байт, слово, двойное слово. Содержимое этих элементов может быть любое – символы, числа. В системе команд микропроцессора имеется семь операций-примитивов обработки цепочек. Каждая из них реализуется в микропроцессоре тремя командами, в свою очередь, каждая из этих команд работает с соответствующим размером элемента — байтом, словом или двойным словом.
Типовой набор действий для выполнения любой цепочечной команды: à Установить значение флага df в зависимости от того, в каком направлении будут обрабатываться элементы цепочки — в направлении возрастания или убывания адресов. à Загрузить указатели на адреса цепочек в памяти в пары регистров ds:(e)si и es: (e)di. à Загрузить в регистр ecx/cx количество элементов, подлежащих обработке. à Выдать цепочечную команду с префиксом повторений. Пересылка цепочек movs адрес_прием, адрес_источника (MOVe String)- переслать цепочку; movsb MOVe String Byte) — переслать цепочку байт; movsw (MOVe String Word) — переслать цепочку слов; movsd (MOVe String Double word) — переслать цепочку двойных слов. Команда копирует байт, слово или двойное слово из цепочки источника, в цепочку приемника. Размер пересылаемых элементов ассемблер определяет, исходя из атрибутов идентификаторов. К примеру, если эти идентификаторы были определены директивой db, то пересылаться будут байты, если идентификаторы были определены с помощью директивы dd, то пересылке подлежат двойные слова. Для цепочечных команд с операндами типа movs адрес_приемника,адрес_источника, не существует машинного аналога. При трансляции в зависимости от типа операндов транслятор преобразует ее в одну из трех машинных команд: movsb, movsw или movsd. Сама по себе команда movs пересылает только один элемент, исходя из его типа, и модифицирует значения регистров esi/si и edi/di. Если перед командой написать префикс rep, то одной командой можно переслать до 64 Кбайт данных. Число пересылаемых элементов должно быть загружено в счетчик — регистр cx (use16) или ecx (use32). Пример 13. Пересылка строк командой movs MODEL small .STACK 256 .datasource db 'Тестируемая строка','$';строка-источник dest db 19 DUP (' ');строка-приёмник .code main: mov ax,@data ;загрузка сегментных регистров mov ds,ax ;настройка регистров DS и ES на адрес сегмента данных mov es,ax cld ;сброс флага DF — обработка строки от начала к концу lea si,source ;загрузка в si смещения строки-источника lea di,dest ;загрузка в DS смещения строки-приёмника mov cx,20 ;для префикса rep — счетчик повторений (длина строки) rep movs dest,source;пересылка строки lea dx,dest mov ah,09h;вывод на экран строки-приёмника int 21h mov ax,4c00h int 21h end mainОперация сравнения цепочек cmps адрес_приемника,адрес_источника (CoMPare String) — сравнить строки; cmpsb (CoMPare String Byte) — сравнить строку байт; cmpsw (CoMPare String Word) — сравнить строку слов; cmpsd (CoMPare String Double word) — сравнить строку двойных слов. Алгоритм работы команды cmps заключается в последовательном выполнении вычитания (элемент цепочки-источника — элемент цепочки-получателя) над очередными элементами обеих цепочек. Принцип выполнения вычитания командой cmps аналогичен команде сравнения cmp. Она, так же, как и cmp, производит вычитание элементов, не записывая при этом результата, и устанавливает флаги zf, sf и of. После выполнения вычитания очередных элементов цепочек командой cmps, индексные регистры esi/si и edi/di автоматически изменяются в соответствии со значением флага df на значение, равное размеру элемента сравниваемых цепочек. Операция сканирования цепочек scas адрес_приемника (SCAning String) — сканировать цепочку; scasb (SCAning String Byte) — сканировать цепочку байт; scasw (SCAning String Word) — сканировать цепочку слов; scasd (SCAning String Double Word) — сканировать цепочку двойных слов Эти команды осуществляют поиск искомого значения, которое находится в регистре al/ax/eax. Принцип поиска тот же, что и в команде сравнения cmps, то есть последовательное выполнение вычитания (содержимое регистра_аккумулятора – содержимое очередного_элемента_цепочки). В зависимости от результатов вычитания производится установка флагов, при этом сами операнды не изменяются.
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Последнее изменение этой страницы: 2021-01-08; просмотров: 278; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.15.147.215 (0.153 с.) |