Assembly 程序集:输出变量,操作系统相关?,执行

Assembly 程序集:输出变量,操作系统相关?,执行,assembly,x86-64,windows-7-x64,Assembly,X86 64,Windows 7 X64,在我们在课堂上讨论了一点组装之后,我正在努力学习一些组装。我正在尝试将一个基本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 ma

在我们在课堂上讨论了一点组装之后,我正在努力学习一些组装。我正在尝试将一个基本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/一旦我弄明白了,我该如何执行它?我有雷达,但我似乎无法通过它运行我的代码。完成后如何执行ASM程序

多谢各位

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

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

  • 您可以将汇编编写的程序作为任何其他二进制可执行文件来执行。首先编写代码,然后组装和链接代码,然后执行。就像其他二进制可执行文件一样。与高级编译语言的区别在于,对于汇编程序(程序)来说,汇编比为编译器编译高级源代码要简单得多

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

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

    Var2: db 3 Var5: db 4 Var1: db 10 Var3: db 1 Var4: db 1 如果希望它们是DWORD(
    dd
    ,每个32位):

    循环1: 添加[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 杰芬 太平绅士1
    我将一些保留为resd,因为我没有按原样设置它们的值。我将包括您在第一篇文章中给出的答案,并对其进行相应的编辑。一旦程序结束,如何打印Var5的内容?像让它显示输出吗?@Niehm我回滚了您的编辑,因为将答案复制到问题会导致答案对将来试图解决同类问题的人失去意义。对于字节,通常使用
    resb
    resd
    用于DWORD)。无论如何,使用
    add Var2,1
    (如果
    Var2
    未定义)向未定义的值添加一些值通常是没有意义的。我没有Windows,但请参阅Windows x86-64程序集Hello world,以查看打印和退出代码。 Loop1: ADD [Var2],byte 1 MOV al,[Var3] MOV [Var5],al mov al,Var4 ADD Var3,al mov al,[Var5] MOV Var4,al mov al,[Var1] CMP Var2,al JE Fin JP Loop1 Loop1: ADD [Var2],dword 1 MOV eax,[Var3] MOV [Var5],eax mov eax,Var4 ADD Var3,eax mov eax,[Var5] MOV Var4,eax mov eax,[Var1] CMP Var2,eax JE Fin JP Loop1