Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: ТОП 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:
… 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
m: shl bx,4 mov ah,01h int 21h вводим n в регистр bx sub ax,130h add bx,ax loop m
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; просмотров: 360; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 216.73.216.115 (0.01 с.) |