在我们在课堂上谈论它之后,我正在努力学习一些装配。我正在尝试翻译一个基本的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程序?
谢谢。
答案 0 :(得分:1)
几乎每个二进制可执行程序都依赖于操作系统,与编写的编程语言无关。用汇编编写的程序也不例外。不要将字节码(例如Java)与本机处理器代码(例如x86-64)混淆。当然,您必须遵循您使用的编程语言的语法。由于与内存寻址相关的语法错误,您的程序不会在大多数汇编程序中汇编。
在受保护的模式操作系统(如Windows 7)中,您必须使用OS 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
如果您希望它们为dwords,请将每个db
替换为dd
。 resd
表示保留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