Рис. 2.5
ВИСНОВОК
Згідно з завданням до курсової роботи, було розроблено три функції на мові Асемблеру, що дозволило зробити їх більш компактними та такими, що є більш ефективними з точки зору не лише кількості операцій, але й за рахунок більшого використання високошвидкісних регістрів замість пам'яті, де це було можливо.
СПИСОК ЛІТЕРАТУРИ
1. Абель П."Язык Ассемблер для IBM РС и программирование".
2. Нортон П."Язык Ассемблера для IBM PC".
3. Юров, Хорошенко "Assembler: учебный курс".
Додаток
.486
.model flat, stdcall
option casemap :none
include \masm32\include\windows.inc
include \masm32\macros\macros.asm
include \masm32\include\masm32.inc
include \masm32\include\gdi32.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\fpu.inc
includelib \masm32\lib\masm32.lib
includelib \masm32\lib\gdi32.lib
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\fpu.lib
strCat PROTO lpszSource:DWORD, lpszAdd:DWORD
.data
strNum1 db "Type the the first number: ", 0
strNum2 db "Type the second number: ", 0
strArithm db "The result of fucntion: ", 0
strType1 db "Type the first string: ", 0
strType2 db "Type the second string: ", 0
strResult db "The result of concationation: ", 0
strZeroDiv db "Zero divide is forbidden. Function is undefined ", 13, 10
cons dq -2.0
one dq 1.0
y dq 0
.data?
buff db 128 dup(?)
str1 db 64 dup(?)
str2 db 64 dup(?)
a dq ?
b dq ?
.code
start:
call arithm
print chr$(13,10)
call string
invoke Sleep, 2000d
exit
arithm proc
LOCAL hInput :DWORD
LOCAL hOutPut :DWORD
LOCAL nRead1 :DWORD
LOCAL nRead2 :DWORD
LOCAL str3[15] :BYTE
invoke GetStdHandle, STD_OUTPUT_HANDLE
mov hOutPut, eax
invoke GetStdHandle, STD_INPUT_HANDLE
mov hInput , eax
invoke szLen, offset strNum1
invoke WriteConsole, hOutPut, offset strNum1, eax, NULL, NULL
invoke ReadConsole, hInput , ADDR str1, 10d, ADDR nRead1, NULL
xor eax, eax
invoke szLen, offset strNum2
invoke WriteConsole, hOutPut, offset strNum2, eax, NULL, NULL
invoke ReadConsole, hInput, ADDR str2, 10d, ADDR nRead2, NULL
xor eax, eax
invoke StrToFloat, ADDR str1, offset a
invoke StrToFloat, ADDR str2, offset b
fld b
fld a
fcom y
fstsw ax
sahf
jz Divide
fxch
fcom y
fstsw ax
sahf
jz Divide
ffree st(1)
ffree st(0)
fstsw ax
sahf
fld b
fld a
fcom
fstsw ax
sahf
je equal
ja greater
jb lower
jmp theend
equal:
fld cons
fstp y
jmp theend
greater:
print chr$("A IS GREATER", 13, 10)
fxch
fdiv
fld one
fadd
fstp y
jmp theend
lower:
print chr$("A IS LOWER", 13, 10)
fsub st(0), st(1)
fld a
fxch
fdiv st(0), st(1)
fstp y
jmp theend
theend:
invoke FloatToStr, y, ADDR str3
xor eax, eax
invoke szLen, offset strArithm
invoke WriteConsole, hOutPut, offset strArithm, eax, NULL, NULL
xor eax, eax
invoke szLen, ADDR str3
mov nRead1, eax
invoke WriteConsole, hOutPut, ADDR str3, nRead1, NULL, NULL
ret
Divide:
invoke szLen, offset strZeroDiv
invoke WriteConsole, hOutPut,offset strZeroDiv, eax, NULL, NULL
arithm endp
string proc
LOCAL hInput :DWORD ;handle of console input
LOCAL hOutPut :DWORD ;handle of output
LOCAL nRead1 :DWORD ;number of bytes read
LOCAL nRead2 :DWORD ;the same
invoke GetStdHandle, STD_OUTPUT_HANDLE
mov hOutPut, eax
invoke WriteConsole, hOutPut, offset strType1, 24d, NULL, NULL
invoke GetStdHandle, STD_INPUT_HANDLE
mov hInput, eax
invoke ReadConsole, hInput, ADDR str1, 64d, ADDR nRead1, NULL
invoke WriteConsole, hOutPut, offset strType2, 25d, NULL, NULL
invoke ReadConsole, hInput, ADDR str2, 64d, ADDR nRead2, NULL
invoke strCat, offset buff, offset str1
invoke strCat, offset buff, offset str2
xor eax, eax
invoke szLen, offset buff
mov nRead2, eax
invoke WriteConsole, hOutPut, offset strResult, 31d, NULL, NULL
invoke WriteConsole, hOutPut, offset buff, nRead2, NULL, NULL
ret
string endp
strCat proc lpszSource:DWORD, lpszAdd:DWORD
push edi
invoke szLen, lpszSource
mov edi, lpszSource
mov ecx, lpszAdd
add edi, eax ; set write starting position
xor edx, edx ; zero index
xor eax, eax ; avoid stall with following AL reads and writes
mov [edi-2], byte ptr 20h
mov [edi-1], byte ptr 20h
@@:
mov al, [ecx+edx] ; write append string to end of source
mov [edi+edx], al
add edx, 1
test al, al ; exit when terminator is written
jne @B
pop edi
mov eax, lpszSource
ret
strCat endp
end start