Перевод 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

Объяснение кода листинга программы

Код написан на ассемблере и выполняет следующие действия:

  1. Получает дескрипторы стандартного ввода и вывода в переменные hConsoleInput и hConsoleOutput.
  2. Очищает экран с помощью функции ClearScreen.
  3. Преобразует кодировку символов кириллицы с помощью функции CharToOem.
  4. Вычисляет значения x и y с помощью функции f, которая в данном случае представляет собой простую функцию, вычисляющую сумму, произведение и квадрат числа.
  5. Форматирует и выводит строку Buffer, содержащую значения x и y, с помощью функции wsprintf.
  6. Ожидает нажатия клавиши Left Alt с помощью цикла while и функции GetAsyncKeyState.
  7. Завершает программу с помощью функции ExitProcess. Список переменных:
    • aszCrLf - строка, содержащая символы новой строки.
    • aszMsgResult - строка, содержащая сообщение, которое будет выведено на экран.
    • hConsoleOutput - дескриптор стандартного вывода.
    • hConsoleInput - дескриптор стандартного ввода.
    • WordsCount - переменная для хранения количества слов в тексте.
    • BufLen - переменная для хранения длины строки.
    • Buffer - буфер для хранения вычисленных значений.
    • X - переменная для хранения значения x.
    • Y - переменная для хранения значения y.
    • aszPressLeftAlt - строка, содержащая сообщение Press Left Alt to exit.
    • LengthOfaszPressLeftAlt - переменная, содержащая длину строки aszPressLeftAlt.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4 из 5