Текст задания
Необходимо выполнить умножение сразу четырех чисел с использованием мультимедийных регистров, а также FPU. С помощью программы – отладчика Debug проследить процесс умножения чисел. Варианты различаются каким именно способом будет заполнен массив (каким видом формулы).
Код программы
OPTION DOTNAME
option casemap:none
include temphls.inc
include win64.inc
OPTION PROLOGUE:rbpFramePrologue
OPTION EPILOGUE:rbpFrameEpilogue
extrn ExitProcess : proc
.data
res dd 7
mas db 16 dup(?)
.code
rand proc ; процедура рандома
push rdx ; сохраняем регистры
push rbx
xor rdx,rdx
mov rax, r11
mov rbx, 25173
mul rbx
mov rbx, 13849
add rax, rbx
mov rbx, 65536
div rbx
mov rax, rdx
mov rbx, 100 ; делаем рандом от 1 до 99
xor rdx,rdx
div rbx
mov rax, rdx
pop rbx
pop rdx ;восстанавливаем регистры
ret
rand endp
Start proc
LOCAL msg:MSG
PINSRD xmm1, ebx, 0 ;заносим в 128битный регистр 4 значения
v ebx = res - 4
PINSRD xmm1, ebx, 1
v ebx = res + 3
PINSRD xmm1, ebx, 2
v ebx = res - 2
PINSRD xmm1, ebx, 3
v r10 = 10
v rdx = 0
mov r11,5
.while TRUE
.if rdx == 16 ; заполняем массив 16-ю значениями
.goto Next
.endif
invoke rand
mov r11, rax
v mas[rdx] = ax
v rdx = rdx + 1
.endw
Next:
v rdx = 1
.while TRUE
v eax = mas[rdx] ; заносим первые четыре значения из массива в 128 регистр xmm2
PINSRD xmm2, eax, 0
v rdx = rdx + 1
v eax = mas[rdx]
PINSRD xmm2, eax, 1
v rdx = rdx + 1
v eax = mas[rdx]
PINSRD xmm2, eax, 2
v rdx = rdx + 1
v eax = mas[rdx]
PINSRD xmm2, eax, 3
PMADDWD xmm2,xmm1 ;перемножаем регистры
PEXTRd EAX,XMM2,0 ;записываем результат обратно в массив
v rdx = rdx - 3
mov mas1[rdx],ax
v rdx = rdx + 1
PEXTRd EAX,XMM2,1
mov mas[rdx],ax
v rdx = rdx + 1
PEXTRd EAX,XMM2,2
mov mas[rdx],ax
v rdx = rdx + 1
PEXTRd EAX,XMM2,3
mov mas[rdx],ax
.if rdx == 16
.goto Ex1
.endif
.endw
Ex1:
v rdx = 1
.while TRUE
v r11 = mas[rdx]
v rdx = rdx + 1
.if rdx == 16
.goto Ex
.endif
.endw
Ex:
invoke ExitProcess,0
Start endp
End
Рисунок 7. Блок-схема.
Рисунок 8. Результат выполнения программы.
Задание № 5 Текст задания
Создать шаблон консольного приложения, который показывает логику работы данных приложений. Приложение должно уметь распознавать аргументы (аргумент может иметь всего один символ; аргументы придумать самостоятельно в соответствии с вариантом структур) и пояснять пользователю, что аргумент прочитан корректно.
Вариант 13
информация о цветке
Код программы
OPTION DOTNAME
option casemap:none
include temphls.inc
include win64.inc
OPTION PROLOGUE:rbpFramePrologue
OPTION EPILOGUE:rbpFrameEpilogue
extrn WriteConsoleA : PROC
extrn AllocConsole : PROC
extrn GetStdHandle : PROC
extrn ReadConsoleA : PROC
extrn ExitProcess : proc
.data
Flowers struct
flowername db 15 dup(?)
color db 15 dup (?)
territory db 15 dup (?)
Flowers ends
Petunia1 Flowers <'Petunia'>
Petunia2 Flowers <'different'>
Petunia3 Flowers <'garden'>
Rose1 Flowers <'Rose'>
Rose2 Flowers <'different'>
Rose3 Flowers <'garden'>
Kalanchoe1 Flowers <'Kalanchoe'>
Kalanchoe2 Flowers <'different'>
Kalanchoe3 Flowers <'home'>
MoneyTree1 Flowers <'MoneyTree'>
MoneyTree2 Flowers <'green'>
MoneyTree3 Flowers <'home'>
Chamomile1 Flowers <'Chamomile'>
Chamomile2 Flowers <'white'>
Chamomile3 Flowers <'garden'>
h DWORD ?
h1 DWORD ?
read byte 20 dup(?)
NumberOfCharsRead DWORD ?
NumberOfCharsWritten DWORD ?
view byte "Flower view:", 0
col byte "Color:", 0
terr byte "Territory:", 0
error byte "ERROR!", 0
newstr byte 10
description byte "*** Press to view information about the flower: ***", 10, 10, "Chamomile - type 'C'", 10, "Rose - type 'R'", 10, "Kalanchoe - type 'K'", 10, , "MoneyTree - type 'M'", 10, "Petunia - type 'P'", 10, "EXIT - type 'E'", 10, 0
.code
Start proc
LOCAL msg:MSG
invoke AllocConsole
invoke GetStdHandle, STD_INPUT_HANDLE
mov h, EAX
invoke GetStdHandle, STD_OUTPUT_HANDLE
mov h1, EAX
invoke WriteConsoleA,h1,ADDR description,SIZEOF description,ADDR NumberOfCharsWritten,0
Read:
invoke WriteConsoleA,h1,ADDR newstr,SIZEOF newstr,ADDR NumberOfCharsWritten,0
invoke ReadConsoleA, h, ADDR read,sizeof read, ADDR NumberOfCharsRead, 0
cmp read, 'E'
je Exit
cmp read, 'P'
je Petunia
cmp read, 'R'
je Rose
cmp read, 'K'
je Kalanchoe
cmp read, 'M'
je MoneyTree
cmp read, 'C'
je Chamomile
Error:
invoke WriteConsoleA, h1, ADDR error,sizeof error, ADDR NumberOfCharsWritten, 0
invoke WriteConsoleA,h1,ADDR newstr,SIZEOF newstr,ADDR NumberOfCharsWritten,0
.goto Read
Petunia:
invoke WriteConsoleA, h1, ADDR view,sizeof view, ADDR NumberOfCharsWritten, 0
invoke WriteConsoleA,h1,ADDR newstr,SIZEOF newstr,ADDR NumberOfCharsWritten,0
invoke WriteConsoleA, h1, ADDR Petunia1,sizeof Petunia1, ADDR NumberOfCharsWritten, 0
invoke WriteConsoleA,h1,ADDR newstr,SIZEOF newstr,ADDR NumberOfCharsWritten,0
invoke WriteConsoleA, h1, ADDR col,sizeof col, ADDR NumberOfCharsWritten, 0
invoke WriteConsoleA,h1,ADDR newstr,SIZEOF newstr,ADDR NumberOfCharsWritten,0
invoke WriteConsoleA, h1, ADDR Petunia2,sizeof Petunia2, ADDR NumberOfCharsWritten, 0
invoke WriteConsoleA,h1,ADDR newstr,SIZEOF newstr,ADDR NumberOfCharsWritten,0
invoke WriteConsoleA, h1, ADDR terr,sizeof terr, ADDR NumberOfCharsWritten, 0
invoke WriteConsoleA,h1,ADDR newstr,SIZEOF newstr,ADDR NumberOfCharsWritten,0
invoke WriteConsoleA, h1, ADDR Petunia3,sizeof Petunia3, ADDR NumberOfCharsWritten, 0
invoke WriteConsoleA,h1,ADDR newstr,SIZEOF newstr,ADDR NumberOfCharsWritten,0
.goto Read
Rose:
invoke WriteConsoleA, h1, ADDR view,sizeof view, ADDR NumberOfCharsWritten, 0
invoke WriteConsoleA,h1,ADDR newstr,SIZEOF newstr,ADDR NumberOfCharsWritten,0
invoke WriteConsoleA, h1, ADDR Rose1,sizeof Rose1, ADDR NumberOfCharsWritten, 0
invoke WriteConsoleA,h1,ADDR newstr,SIZEOF newstr,ADDR NumberOfCharsWritten,0
invoke WriteConsoleA, h1, ADDR col,sizeof col, ADDR NumberOfCharsWritten, 0
invoke WriteConsoleA,h1,ADDR newstr,SIZEOF newstr,ADDR NumberOfCharsWritten,0
invoke WriteConsoleA, h1, ADDR Rose2,sizeof Rose2, ADDR NumberOfCharsWritten, 0
invoke WriteConsoleA,h1,ADDR newstr,SIZEOF newstr,ADDR NumberOfCharsWritten,0
invoke WriteConsoleA, h1, ADDR terr,sizeof terr, ADDR NumberOfCharsWritten, 0
invoke WriteConsoleA,h1,ADDR newstr,SIZEOF newstr,ADDR NumberOfCharsWritten,0
invoke WriteConsoleA, h1, ADDR Rose3,sizeof Rose3, ADDR NumberOfCharsWritten, 0
invoke WriteConsoleA,h1,ADDR newstr,SIZEOF newstr,ADDR NumberOfCharsWritten,0
.goto Read
Kalanchoe:
invoke WriteConsoleA, h1, ADDR view,sizeof view, ADDR NumberOfCharsWritten, 0
invoke WriteConsoleA,h1,ADDR newstr,SIZEOF newstr,ADDR NumberOfCharsWritten,0
invoke WriteConsoleA, h1, ADDR Kalanchoe1,sizeof Kalanchoe1, ADDR NumberOfCharsWritten, 0
invoke WriteConsoleA,h1,ADDR newstr,SIZEOF newstr,ADDR NumberOfCharsWritten,0
invoke WriteConsoleA, h1, ADDR col,sizeof col, ADDR NumberOfCharsWritten, 0
invoke WriteConsoleA,h1,ADDR newstr,SIZEOF newstr,ADDR NumberOfCharsWritten,0
invoke WriteConsoleA, h1, ADDR Kalanchoe2,sizeof Kalanchoe2, ADDR NumberOfCharsWritten, 0
invoke WriteConsoleA,h1,ADDR newstr,SIZEOF newstr,ADDR NumberOfCharsWritten,0
invoke WriteConsoleA, h1, ADDR terr,sizeof terr, ADDR NumberOfCharsWritten, 0
invoke WriteConsoleA,h1,ADDR newstr,SIZEOF newstr,ADDR NumberOfCharsWritten,0
invoke WriteConsoleA, h1, ADDR Kalanchoe3,sizeof Kalanchoe3, ADDR NumberOfCharsWritten, 0
invoke WriteConsoleA,h1,ADDR newstr,SIZEOF newstr,ADDR NumberOfCharsWritten,0
.goto Read
MoneyTree:
invoke WriteConsoleA, h1, ADDR view,sizeof view, ADDR NumberOfCharsWritten, 0
invoke WriteConsoleA,h1,ADDR newstr,SIZEOF newstr,ADDR NumberOfCharsWritten,0
invoke WriteConsoleA, h1, ADDR MoneyTree1,sizeof MoneyTree1, ADDR NumberOfCharsWritten, 0
invoke WriteConsoleA,h1,ADDR newstr,SIZEOF newstr,ADDR NumberOfCharsWritten,0
invoke WriteConsoleA, h1, ADDR col,sizeof col, ADDR NumberOfCharsWritten, 0
invoke WriteConsoleA,h1,ADDR newstr,SIZEOF newstr,ADDR NumberOfCharsWritten,0
invoke WriteConsoleA, h1, ADDR MoneyTree2,sizeof MoneyTree2, ADDR NumberOfCharsWritten, 0
invoke WriteConsoleA,h1,ADDR newstr,SIZEOF newstr,ADDR NumberOfCharsWritten,0
invoke WriteConsoleA, h1, ADDR terr,sizeof terr, ADDR NumberOfCharsWritten, 0
invoke WriteConsoleA,h1,ADDR newstr,SIZEOF newstr,ADDR NumberOfCharsWritten,0
invoke WriteConsoleA, h1, ADDR MoneyTree3,sizeof MoneyTree3, ADDR NumberOfCharsWritten, 0
invoke WriteConsoleA,h1,ADDR newstr,SIZEOF newstr,ADDR NumberOfCharsWritten,0
.goto Read
Chamomile:
invoke WriteConsoleA, h1, ADDR view,sizeof view, ADDR NumberOfCharsWritten, 0
invoke WriteConsoleA,h1,ADDR newstr,SIZEOF newstr,ADDR NumberOfCharsWritten,0
invoke WriteConsoleA, h1, ADDR Chamomile1,sizeof Chamomile1, ADDR NumberOfCharsWritten, 0
invoke WriteConsoleA,h1,ADDR newstr,SIZEOF newstr,ADDR NumberOfCharsWritten,0
invoke WriteConsoleA, h1, ADDR col,sizeof col, ADDR NumberOfCharsWritten, 0
invoke WriteConsoleA,h1,ADDR newstr,SIZEOF newstr,ADDR NumberOfCharsWritten,0
invoke WriteConsoleA, h1, ADDR Chamomile2,sizeof Chamomile2, ADDR NumberOfCharsWritten, 0
invoke WriteConsoleA,h1,ADDR newstr,SIZEOF newstr,ADDR NumberOfCharsWritten,0
invoke WriteConsoleA, h1, ADDR terr,sizeof terr, ADDR NumberOfCharsWritten, 0
invoke WriteConsoleA,h1,ADDR newstr,SIZEOF newstr,ADDR NumberOfCharsWritten,0
invoke WriteConsoleA, h1, ADDR Chamomile3,sizeof Chamomile3, ADDR NumberOfCharsWritten, 0
invoke WriteConsoleA,h1,ADDR newstr,SIZEOF newstr,ADDR NumberOfCharsWritten,0
.goto Read
Exit:
invoke ExitProcess,0
Start endp
end
Рисунок 9. Блок-схема.
Рисунок 10. Результат выполнения программы.
