Перевод vhdl кода на ассемблер - Assembler
Формулировка задачи:
Помогите пожалуйста из vhdl-кода "сделать" assembler-код
library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; entity fibo is port( reset:in std_logic; f0:in integer; f1:in integer; y:out integer ); end Fibo; architecture fibo of fibo is begin process(reset) variable n:integer; variable g1_prev:integer; variable g2_prev:integer; variable g:integer; variable k:real; begin if reset='1' then g1_prev:=f1; g2_prev:=f0; for n in 1 to 5 loop g:=g1_prev+g2_prev; g2_prev:=g1_prev; g1_prev:=g; end loop; y<=(1+(natural(g*g/2)+natural(g*g*g*g/4))); end if; end process; end fibo;
Решение задачи: «Перевод vhdl кода на ассемблер»
textual
Листинг программы
.486 .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 aszCrLf db 0Dh, 0Ah, 0 aszMsgResult db 'x=f(6)=%d, y=%d', 0Dh, 0Ah, 0 aszPressLeftAlt db 0Dh, 0Ah, 0Dh, 0Ah, "Press Left Alt to exit", 0 .data? hConsoleOutput HANDLE ? hConsoleInput HANDLE ? WordsCount dd ? BufLen dd ? Buffer db 1024 dup(?) X dd ? Y dd ? .code start proc ; получение описателей ввода и вывода консоли invoke GetStdHandle, STD_INPUT_HANDLE mov hConsoleInput, eax invoke GetStdHandle, STD_OUTPUT_HANDLE mov hConsoleOutput, eax ;очистка экрана invoke ClearScreen ;преобразование кодировки символов кириллицы invoke CharToOem, ADDR aszMsgResult, ADDR aszMsgResult mov eax, 1 ;f(1)=1 mov ebx, 1 ;f(0)=1 mov ecx, 5 ;ещё 5 итераций @@for: mov edx, eax add eax, ebx mov ebx, edx loop @@for mov [X], eax ; mov ebx, 1 ;y=1+... mul eax ; +(x^2/2)+... mov edx, eax shr edx, 1 add ebx, edx mul eax ; +(x^4/4) shr eax, 2 add ebx, eax mov [Y], ebx ; invoke wsprintf, ADDR Buffer, ADDR aszMsgResult, \ [X], [Y] mov [BufLen], eax invoke WriteConsole, hConsoleOutput, ADDR Buffer,\ BufLen, ADDR BufLen, NULL ;ожидание нажатия Left Alt invoke WriteConsole, hConsoleOutput, ADDR aszPressLeftAlt,\ LENGTHOF aszPressLeftAlt - 1, ADDR BufLen, NULL @@WaitForLAlt: invoke GetAsyncKeyState, VK_LMENU and eax, 8000h jz @@WaitForLAlt ;завершение программы invoke ExitProcess, 0 start endp end start
Объяснение кода листинга программы
Код написан на ассемблере и выполняет следующие действия:
- Получает дескрипторы стандартного ввода и вывода в переменные
hConsoleInput
иhConsoleOutput
. - Очищает экран с помощью функции
ClearScreen
. - Преобразует кодировку символов кириллицы с помощью функции
CharToOem
. - Вычисляет значения
x
иy
с помощью функцииf
, которая в данном случае представляет собой простую функцию, вычисляющую сумму, произведение и квадрат числа. - Форматирует и выводит строку
Buffer
, содержащую значенияx
иy
, с помощью функцииwsprintf
. - Ожидает нажатия клавиши Left Alt с помощью цикла
while
и функцииGetAsyncKeyState
. - Завершает программу с помощью функции
ExitProcess
. Список переменных:aszCrLf
- строка, содержащая символы новой строки.aszMsgResult
- строка, содержащая сообщение, которое будет выведено на экран.hConsoleOutput
- дескриптор стандартного вывода.hConsoleInput
- дескриптор стандартного ввода.WordsCount
- переменная для хранения количества слов в тексте.BufLen
- переменная для хранения длины строки.Buffer
- буфер для хранения вычисленных значений.X
- переменная для хранения значенияx
.Y
- переменная для хранения значенияy
.aszPressLeftAlt
- строка, содержащая сообщениеPress Left Alt to exit
.LengthOfaszPressLeftAlt
- переменная, содержащая длину строкиaszPressLeftAlt
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д