汇编:输出变量,OS依赖?,执行

时间:2013-04-17 19:59:11

标签: assembly x86-64 windows-7-x64

在我们在课堂上谈论它之后,我正在努力学习一些装配。我正在尝试翻译一个基本的java程序,找到一个斐波纳契数到汇编中,我认为我的逻辑是正确的,但我的朋友告诉我它可能不适用于我的Windows 7 64位计算机,因为ASM因操作系统而异( :他认真吗?)

这是我的代码:

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程序?

谢谢。

1 个答案:

答案 0 :(得分:1)

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

  2. 在受保护的模式操作系统(如Windows 7)中,您必须使用OS API进行打印。

  3. 您执行以汇编语言编写的程序作为任何其他二进制可执行文件。首先编写代码,然后组装并链接它,然后执行。就像任何其他二进制可执行文件与高级编译语言的不同之处在于,汇编程序(程序)要为编译器编译更高级别的源代码,这是一项非常简单的任务。

  4. 在x86-64程序集中,您无法直接从内存地址移动到另一个地址。您必须首先移动处理器的一个通用寄存器,然后从该寄存器移动到另一个存储器地址。但是,有一些指令也会从内存转移到内存,例如movsbmovswmovsdmovsq,但是要开始使用它们会更容易学习它们后面。

    目前尚不清楚您想要变量的大小,因为您对某些变量使用db,而对其他变量使用resd。如果您希望所有Var1Var2Var3Var4Var5都是字节,那么它应该是例如:

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

    如果您希望它们为dwords,请将每个db替换为ddresd表示保留dwords,以保留应使用resb的字节。

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

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

    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
    

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

    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