Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Лекция №8. Перевод из шестнадцатиричной системы счисления в десятичную. Деление с остатком. Числа с плавающей запятой. Работа с сопроцессором

Пример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 кодов.

                      A B C D E F
  ... ...     @ P ' Р А Р а ... ... ... р Ё
  ... ... !   A Q a Q Б С б ... ... ... с ё
  ... ... "   B R b R В Т в ... ... ... т Є
  ... ... #   C S c S Г У г ... ... ... у є
  ... ... $   D T d T Д Ф д ... ... ... ф Ї
  ... ... %   E U e U Е Х е ... ... ... х ї
  ... ... &   F V f V Ж Ц ж ... ... ... ц Ў
  ... ... '   G W g W З Ч з ... ... ... ч ў
  ... ... (   H X h X И Ш и ... ... ... ш °
  ... ... )   I Y i Y Й Щ й ... ... ... щ
A ... ... * : J Z j Z К Ъ к ... ... ... ъ ·
B ... ... + ; K [ k { Л Ы л ... ... ... ы
C ... ... , < L \ l | М Ь м ... ... ... ь
D ... ... - = M ] m } Н Э н ... ... ... э ¤
E ... ... . > N ^ n ~ О Ю о ... ... ... ю
F ... ... / ? O _ o ¤ П Я п ... ... ... я  

 

 


Блок-схема алгоритма вывода на экран содержимого регистра ах в любой системе исчисления:

       
 
1) Инициализация регистра данными: mov ax,C. Необходимо вывести на экран значение «С». С имеет размерность в 2 байта максимум. 2) Инициализация регистра si: mov si,10;10-основание системы исчисления, в которую необходимо перевести значение С. 3) Инициализация регистра edi: mov edi,5; 5 – количество позиций, которое отводится для десятичного числа (под ответ).
 
   

 

 


Пример 2: 6*С+(В-С+1)/2 .386 .model flat, stdcall extrn ExitProcess:PROC .data B DW 8 C DW 3 D Db 2 .code start:   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:; результат (B-C) оказывается отрицательным! neg ax mov bx,1 sub ax,bx xor bx,bx mov bl,D div bl neg ax add Ax,Dx m2: push 0h call ExitProcess end start
Решение задач.

Пример 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 cx,ax

mov ax,C

mov bx,dx

mov si,10

mov edi,7

Если остаток есть, то переводим делитель в десятичную систему счисления
lp2: 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 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 предоставляет восемь регистров для хранения данных и пять вспомогательных регистров
Поделиться с друзьями:


Дата добавления: 2014-01-07; Просмотров: 441; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.046 сек.