Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для C++
Уроки по C#
Уроки по Python
HTML
Веб-дизайн
Ассемблер в среде Windows
ActiveX
Javascript
Общее о Линукс
Линукс - подробно
Линукс - новое
Delphi
Паскаль для начинающих
Турбопаскаль
Новости
Партнеры
Наши предложения
Архив новостей





Сопроцессор устанавливает в соответствии с результатом сравнения флаги состояния. Перед тем как опросить флаги состояния, программа должна считать слово состояния в память. Самый простой способ — загрузить флаги состояния в регистр АН, а затем, чтобы облегчить себе задачу проверки условия, -г- в регистр флагов процессора.
В операции всегда участвует вершина стека, поэтому в команде надо указать только один регистр или ячейку памяти. После сравнения в слове состояния процессора содержится результат этой операции. При этом бит со помещается на место флага переноса CF, С2 — на место бита четности PF, а сз — на место ZF.
Для отражения результата сравнения необходимы только два бита состояния: сз и со. В табл. 2.1 приводится соотношение сравниваемых операндов и битов состояния.
Таблица 2.1. Соотношение сравниваемых операндов и битов состояния
с з с о Результат
0 0 ST > источник
0 1 ST < источник
1 0 ST = источник
1 1 ST и источник несравнимы

Следующая программа (листинг 2.22) сравнивает два вещественных числа и выводит результат сравнения на экран.
Листинг 2.22. Программа, выполняющая сравнение двух вещественных чисел
.386
.model flat, stdcall
option casemap :none
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\masm32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\masm32.lib
.data
conTitle DB "Comparison of two reals", 0
mes DB "The result of comparison X = -87.34 and Y = -136.57 : ",0
len_mes EQU $-mes
xgey DB "X >= Y", 0
len_xgey EQU $-xgey
xly DB "X < Y", 0
len_xly EQU $-xly
X
Y
Flag
DD -87.34
DD -136.57
DD 0
readBuf DB ?
lenReadBuf DD 1
hStdln DD 0
hStdOut DD 0
chrsRead DD 0
chrsWritten DD 0
STD_INP_HNDL DD -10
STD OUTP HNDL DD -11
. code
start:
call AllocConsole
test AX, EAX
jz ex
push offset conTitle
call SetConsoieTitieA
test EAX, EAX
jz ex
call getout_hndl
call getinp_hndl
push ЕВХ
mov ЕВХ, offset mes
mov ЕСХ, len_mes
call write_con
pop EBX
finit
fid
fcomp
fstsw
sahf
jna
mov
x_less_y:
cmp
je
DWORD PTR X
DWORD PTR Y
AX
x_less_y
DWORD PTR Flag,
Flag, 0
WriteXLY
push
mov
mov
call
pop
jmp
WriteXLY:
push
mov
mov
call
pop
EBX
EBX, offset xgey
ECX, len_xgey
write_con
EBX
rcon
EBX
EBX, offset xly
ECX, len_xly
write_con
EBX
; ожидание ввода с консоли и выход
rcon:
call
ex:
push
call
read con
ExitProcess

Процедуры
getout_hndl proc
push STDD_ OOUU'T P HNDL
call GetStdHandle
mov hStdOut, EAX
ret
getout_hndl endp
getinp_hndl proc
push STD_INP_HNDL
call GetStdHandle
mov hStdln, EAX
ret
getinp_hndl endp
write_con proc
push 0
push chrsWritten
push ECX
push EBX
push hStdOut
call WriteConsoleA
ret
write_con endp
read_con proc
push 0
push chrsRead
push lenReadBuf
push offset readBuf
push hStdln
call ReadConsoleA
ret
read_con endp
end start

Операция сравнения в программе реализована в следующих строках программного кода:
f init
fid DWORD PTR X
fcomp DWORD PTR Y
fstsw AX
sahf
jna x_less_y


 
 
 

Библиотека программиста. 2009.
Администратор: admin@programmer-lib.ru