Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву
Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Устанавливает флаг cf в 1, фиксируя воображаемый заём из старшего разряда.Содержание книги
Поиск на нашем сайте Команда aas применяется вместе с основными командами вычитания sub и sbb. В ассемблере отсутствует также формальное правило введения знака для неупакованных BCD- чисел. Решение этого вопроса остаётся за программистом. Как один из возможных можно принять принцип кодирования знака для упакованных чисел, который реализуется директивой DT. Например, число -386 (младший байт по старшему адресу) инициализируем следующим образом: Oper DB 80h,6,8,3;Неупакованное BCD- число -386
Например: 2-7 .data a db 02h b db 07h .code xor ax,ax; очистка ах xor bx,bx; очистка bx mov al,a; в al занесли 1 sbb al,b; al=2-7; 0000 0010-0000 0111-0=1111 1011 aas; 1011-0110=0101, al=0000 0101, cf=1
Умножение Для того, чтобы перемножить два одноразрядных BCD –числа необходимо: 1) поместить один из сомножителей в регистр al (этого требует команда mul); 2) поместить второй операнд в регистр или память, отведя байт; 3) перемножить сомножители командой mul (результат будет в ах); 4) результат получится в двоичном коде и его нужно корректировать. Для коррекции результата после умножения применяется команда: AAM – коррекция результата умножения для представления в символьном виде. Команда не имеет операндов и работает с регистром ах следующим образом: 1) делит ax на 10; Результат деления записывается так: частное – в ah, остаток в al.
Пример: умножим 2*47=94d=01011110b=ax ax/10=> ah=0000 1001, al=0000 0100 В результате после выполнения команды aam в регистрах al и ah находятся правильные двоично-десятичные цифры произведения двух цифр.
Деление Предварительно в регистре ах необходимо получить две неупакованные BCD –цифры делимого. Далее используется команда: AAD – коррекция делимого для представления в символьном виде. Команда AAD: 1) преобразует двузначное неупакованное BCD-число в регистре ах в двоичное число; 2) полученное двоичное число используется в качестве делимого в операции деления; Полученное двоичное число помещается в регистр aх. Делимое будет двоичным числом из диапазона 0…99. Алгоритм, по которому работает команда aad: 1) умножается старшая цифра исходного BCD –числа в ах (содержимое ah) на 10; 2) выполняется сложение ah+al, результат которого (двоичное число) заносится в al; 3) обнуляется содержимое ah. Далее необходимо использовать команду деления div для выполнения деления содержимого ах на одну BCD-цифру, находящуюся в байтовом регистре или байтовой ячейки памяти.
Например, разделим десятичное 25 на 5: Mov ax,0205h; 25 в неупакованном формате Mov bl,5 Aad; теперь в АХ находится 19h div bl; АХ = 0005 Флаги SF, ZF и PF устанавливаются в соответствии с результатом, OF, AF и CF не определены.
Ah=0000 0010; al=0000 0101 1) 0000 0010 *0000 1010=0001 0100=ah 2) 0001 0100+0000 0101=0001 1001=al 3) ah=0000 0000; ax=0000 0000 0001 10012=2510
Упакованные BCD-числа Сложение Пример1: 67=0110 0111 + 75=0111 0101 = 142=1101 1100=22010 – неверный результат. Правильный результат 0001 0100 0010 (14210) Для корректировки результата существует команда: DAA – коррекция результата сложения для представления в десятичном виде. Команда daa преобразует содержимое регистра al в две упакованные десятичные цифры по следующему алгоритму: 1) если младшие четыре бита AL больше либо равно 9 или флаг AF = 1, то AL увеличивается на 6, CF устанавливается, если при этом сложении произошел перенос, и AF устанавливается в 1. 2) иначе AF = 0. 3) если теперь старшие четыре бита AL больше 9 или флаг CF = 1, то AL увеличивается на 60h и CF устанавливается в 1. 4) иначе CF = 0.
Флаги AF и CF устанавливаются, если в ходе коррекции происходил перенос из первой или второй цифры соответственно, SF, ZF и PF устанавливаются в соответствии с результатом, флаг OF не определен. Например, если AL содержит число 19h, последовательность команд: Inc al daa; AL=20h (а не 1Ah, как было бы после INC).
1) 19h+1=1A 2) 1A16 =1 10102 +01102 =10 00002 =2016
Вычитание Пример1: 67-75 67=0110 0111 + -75=1011 0101 (75=1001011, 0110100+1=10110101=-75) = -8=0001 1100=28d – результат неверный. Верный результат 0000 1000=810.
Контроль за знаком осуществляется с помощью флага cf, который фиксирует заём из старших разрядов. Вычитание BCD-чисел осуществляется командами sub или sbb. Коррекция результата осуществляется командой: DAS – коррекция результата вычитания для представления в десятичном виде.
Команда работает по следующему алгоритму: 1) если младшие четыре бита AL больше 9 или флаг AF = 1, то AL уменьшается на 6, CF устанавливается, если при этом вычитании произошел заем, и AF устанавливается в 1. 2) иначе AF = 0. 3) если теперь старшие четыре бита AL больше 9 или флаг CF = 1, то AL уменьшается на 60h и CF устанавливается в 1. 4) иначе CF = 0.
Пример: пусть AL содержит число 20h, тогда после команд: Dec al das; AL=19h (а не 1Fh, как было бы после DEC).
Пример5: Вывод на экран содержимого регистра АХ; 1 ASCII 31; 2 ASCII 32;... Под WIN32. .386 .model flat, stdcall includelib import32.lib extrn ExitProcess:PROC extrn MessageBoxA:PROC .data Ttl db 'Vivod na ekran',0h Msg db 'Sodergimoe registra eax=' Msg1 db 6 dup(' ') db 0h C dw 65535;65535d=1111 1111 1111 1111
.code start: mov ax,C mov si,10 mov edi,5
lp1: xor dx,dx;ax=FFFFh, si=000Ah, dx=0000h div si;FFFFh/000Ah=1999,0005h;1999h/000Ah=028F,0003h; 028Fh/000Ah=0041,0005h; 0041h/000Ah=0006,0005h; 0006h/000Ah=0000,0006h ; AX,DX AX,DX AX,DX AX,DX AX,DX xchg ax,dx;Ax=0005h:Dx=1999h; Ax=0003h:Dx=028Fh Ax=0005h:Dx=0041h Ax=0005h:Dx=0006h Ax=0006h:Dx=0000h add al,'0';AX=0035h Ah=00h Al=35h; Ax=0033h Ah=00h Al=33h Ax=0035h Ah=00h Al=35h Ax=0035h Ah=00h Al=35h Ax=0036h Ah=00h Al=36h mov byte ptr [Msg1+edi],al xchg ax,dx;Ax=1999h:Dx=0035h; Ax=028Fh:Dx=0033h; Ax=0041h:Dx=0035h; Ax=0006h:Dx=0035h; Ax=0000h:Dx=0036h; dec edi; edi=4 edi=3 edi=2 edi=1 edi=0 or ax,ax;1999 or 1999 = 1111h 028Fh or 028Fh=0111h 0041h or 0041h=0011h 0006h or 0006h=0001h 0000h or 0000h=0000h ; устанавливает флаг ZF в 1 если в АХ не 0 jne lp1 push 0h push offset Ttl push offset Msg push 0h call MessageBoxA push 0h call ExitProcess end start Таблица ASCII кодов.
Блок-схема алгоритма вывода на экран содержимого регистра ах в любой системе исчисления:
Пример 1: 6*С+(В-С+1)/2 model small .stack 100h .data B DW 8; резервирование памяти для данных размером 2 байт; C DW 3; резервирование памяти для данных размером 2 байт; D Db 2; резервирование памяти для данных размером 1 байт; .code start: mov AX,@data mov DS,AX mov AX,6 mov BX,C mul BX mov Dx,AX mov Ax,B mov Bx,C sub Ax,Bx jl m1; отрицательный ли результат? Если да, то переход на метку m1. Если ;результат положительный, то продолжаем выполнять следующую команду. add ax,1 xor bx,bx mov bl,d div bl add ax,dx jmp m2 m1:; результат оказывается отрицательным! neg ax mov bx,1 sub ax,bx xor bx,bx mov bl,d div bl neg ax add Ax,Dx m2: mov AX,4C00h int 21h end start
Деление с остатком Пример 2: Выполнить деление положительных чисел В/С; 1000/53=18,46/53. (real3.asm) .386 .model flat, stdcall includelib import32.lib extrn ExitProcess:PROC extrn MessageBoxA:PROC .data Ttl db "Rezultat deleniya raven",0h Msg db 8 dup(' '),0h db 0h B DW 1000 C DW 53
.code start: mov ax,B mov bx,C mov dx,00h div bx
cmp dx,0000h jz m3; если остатка нет, то переходим на метку m3.
mov ax,C mov bx,dx mov si,10 mov edi,7
div si xchg ax,dx add al,'0' mov byte ptr [Msg+edi],al xchg ax,dx dec di or ax,ax jne lp2 mov byte ptr [Msg+edi],'/' dec di
mov si,10 mov ax,bx lp3: xor dx,dx div si xchg ax,dx add al,'0' mov byte ptr [Msg+edi],al xchg ax,dx dec di or ax,ax; устанавливает флаг ZF в 1 если в АХ не 0 jne lp3
mov byte ptr [Msg+edi],',' dec di
mov si,10 mov ax,cx lp4: xor dx,dx div si xchg ax,dx add al,'0' mov byte ptr [Msg+edi],al xchg ax,dx dec di or ax,ax jne lp4 jmp m4
m3: mov si,10 mov edi,7 lp5: xor dx,dx div si xchg ax,dx add al,'0' mov byte ptr [Msg+edi],al xchg ax,dx dec di or ax,ax jne lp5
m4: push 0h push offset Ttl push offset Msg push 0h call MessageBoxA push 0h call ExitProcess end start
В процессорах Intel все операции с плавающей запятой выполняет специальное устройство, FPU (Floating Point Unit), с собственными регистрами и собственным набором команд, поставлявшееся сначала в виде сопроцессора (8087, 80287, 80387, 80487), а начиная с 80486DX — встраивающееся в основной процессор. Типы данных FPU
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Последнее изменение этой страницы: 2016-09-13; просмотров: 443; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 216.73.216.169 (0.007 с.) |