0

在我们在课堂上讨论了一下之后,我正在尝试学习一些汇编。我正在尝试将一个基本的 java 程序翻译为找到一个斐波那契数成汇编,我认为我的逻辑是正确的,但我的朋友告诉我它可能无法在我的 Windows 7 64 位计算机上工作,因为 ASM 因操作系统而异( :O 他是认真的吗?)

这是我的代码:

SECTION .data   

Var2: resd 3
Var5: resd 4
Var1: db 10
Var3: db 1
Var4: db 1

SECTION .text   
global main
main:

MOV Var2,0

Loop1:
  ADD Var2,1
  MOV Var5,Var3
  ADD Var3,Var4
  MOV Var4,Var5
  CMP Var2,Var1
  JE Fin
  JP Loop1

Fin:
Put printing in here.

2/ ASM 中是否有类似于 System.out.print 的内容?

3/一旦我弄清楚了,我该如何执行它?我得到了 RadASM,但我似乎无法通过它运行我的代码。完成后如何执行 ASM 程序?

谢谢你。

4

1 回答 1

1
  1. 几乎每个二进制可执行程序都依赖于操作系统,与编写它的编程语言无关。用汇编编写的程序也不例外。不要将字节码(例如 Java)与本机处理器代码(例如 x86-64)混淆。当然,您必须遵循您使用的编程语言的语法。由于与内存寻址相关的语法错误,您的程序将无法在大多数汇编器上进行汇编。

  2. 在 Windows 7 等保护模式操作系统中,您必须使用操作系统 API 进行打印。

  3. 您可以像执行任何其他二进制可执行文件一样执行以汇编语言编写的程序。首先编写代码,然后组装和链接它,然后执行。就像任何其他二进制可执行文件一样。与高级编译语言的不同之处在于,汇编程序(程序)比为编译器编译高级源代码要简单得多。

在 x86-64 汇编中,您不能直接从内存地址移动到另一个地址。您必须首先移动处理器的一个通用寄存器,然后从该寄存器移动到另一个内存地址。但是,也有一些指令会在内存之间移动,例如movsb、和movsw,但要开始使用,以后学习它们会更容易。movsdmovsq

目前尚不清楚您希望变量的大小是什么,因为您db对某些变量和resd其他变量使用。如果您希望所有Var1, Var2, Var3, Var4,Var5都是字节,那么它应该是例如:

Var2:分贝 3
Var5:分贝 4
Var1:分贝 10
Var3:分贝 1
Var4:分贝 1

如果您希望它们成为例如 dwords,请将每个替换dbdd. resd表示保留双字,以保留您应该使用的字节resb

您必须知道汇编中操作数的大小。Assembler 不会为您做出决定。

假设上面的所有变量都是字节(db每个 8 位),循环可能类似于(NASM/YASM 语法):

循环1:
    ADD [Var2],字节 1

    MOV al,[Var3]
    MOV [Var5],al

    mov al,Var4
    添加 Var3,al

    移动,[Var5]
    MOV Var4,al

    移动,[Var1]
    CMP Var2,al
    杰芬
    JP循环1

如果你想让它们成为双字(dd每个 32 位):

循环1:
    ADD [Var2],dword 1

    MOV eax,[Var3]
    MOV [Var5],eax

    mov eax,Var4
    添加 Var3,eax

    mov eax,[Var5]
    MOV Var4,eax

    mov eax,[Var1]
    CMP Var2,eax
    杰芬
    JP循环1
于 2013-04-17T20:30:37.537 回答