【问题标题】:Java to Assembly Language ASM [duplicate]Java 到汇编语言 ASM [重复]
【发布时间】:2020-06-10 04:32:52
【问题描述】:

我正在尝试将以下循环写入汇编语言。此代码读取用户输入并输出斐波那契数。例如,如果用户输入 10,程序将显示斐波那契数列的前 10 个数字。如果可以,请帮忙!

  while (i <= n) {
   if (i == n)
    System.out.print(num1);
   else
    System.out.print(num1 + " + ");

   int sum = num1 + num2;
   num1 = num2;
   num2 = sum;
   i++;

【问题讨论】:

  • 为了改善您的问题,请考虑添加您正在使用的架构和汇编程序、您遇到的问题以及您目前拥有的汇编代码。另外,请查看此相关问题:“汇编语言中的斐波那契数列”stackoverflow.com/q/16409574/12378826

标签: assembly fibonacci


【解决方案1】:

环境

  • HLA(高级汇编器 - HLABE 后端,POLINK 链接器) 版本 2.16 build 4413(原型)
  • Windows 10

注意

  • 下面的这个例子是用 HLA(高级汇编)编写的,这允许使用高级功能,如 for 循环和标准库提供的输入/输出。因此,需要将其中一些代码转换为汇编,以获得纯汇编解决方案。
  • 此示例还假设 x86 或类似变体。
  • 示例从第一个元素为 0 开始,如用户输入 1,然后打印 0。
  • 此示例将在斐波那契数列的第 47 个元素之后中断。

示例

program Fibonacci;
#include("stdlib.hhf");

static
    Loops:   int32;
    Number1: int32:= 0;
    Number2: int32:= 1;

begin Fibonacci;
    // Prompt user for input
    stdout.put("Enter a number: ");

    // Get user input
    stdin.get(Loops);

    // Loop for the requested amount
    for (mov(0, ECX); ECX < Loops; inc(ECX)) do

        // Print the Fn element
        stdout.put(Number1, nl);

        // Calculate the Fn+2 element
        mov(Number1, EAX);
        add(EAX, Number2);

        // Store the Fn+1 element as the next Fn element
        mov(Number2, Number1);

        // Store the Fn+3 element as the Fn+2 element
        mov(EAX, Number2);
    endfor;   
end Fibonacci;

没有静态变量

program Fibonacci;
#include("stdlib.hhf");

begin Fibonacci;
    xor(EBX, EBX); 
    mov(1, EDX);
    stdout.put("Enter a number: ");
    stdin.geti32();
    for (mov(0, ECX); ECX < EAX; inc(ECX)) do
        stdout.put((type int32 EBX), nl);
        mov(EDX, EBP);
        add(EBX, EDX);
        mov(EBP, EBX);
    endfor;   
end Fibonacci;

【讨论】:

  • HLA真的能让你mov在两个内存变量之间吗?它使用什么寄存器进行临时存储? (mov [mem], [mem] 不能编码为单个机器指令,只能编码为 movsdpush [mem] 之类的带有隐式内存操作数的东西)。无论如何,使用保留调用的寄存器而不是内存可能会更容易也更有效。 OP 可能有局部变量,而不是像您正在使用的全局/静态变量。
  • 是的,HLA 支持两个内存变量之间的mov。没有寄存器用于临时存储,而是将堆栈与push [mem] 然后pop [mem] 一起使用。在此特定示例中,生成的代码为:push dword [0x4002004]pop dword [0x4002000]。好点,调用保留寄存器和静态变量可能是首选。
猜你喜欢
  • 2021-10-01
  • 1970-01-01
  • 2017-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-24
  • 1970-01-01
  • 2021-08-22
相关资源
最近更新 更多