在ASM x86 FASM汇编程序中声明函数

时间:2013-01-24 02:21:41

标签: assembly fasm

我第一次参加集会..我跳过helloworld并决定直接潜入并做一个CRC32Checksum:l

现在我很困惑大声笑..

我的尝试:

format PE console                                ;Format PE OUT GUI 4.0
entry main

include 'macro/import32.inc'

section '.idata' import data readable           ;Import Section.
library msvcrt,'msvcrt.dll'
import msvcrt, printf, 'printf',\
exit,'exit', getchar, 'getchar'

section '.data' data readable writeable         ;Constants/Static Section.
InitialValue dd 0

section '.code' code readable executable
main:
   jmp CRC32Checksum     ;I want to change this to a call [CRC32Checksum]..
   call [getchar]
   mov eax, 0
   ret 0


CRC32Checksum:
   push ebx
   mov ebp, esp
   mov eax, InitialValue
   NOT eax
   pop ebx
ret

如何拨打CRC32Checksum?我是否走在正确的轨道上?如何在汇编中声明函数?

2 个答案:

答案 0 :(得分:2)

只需使用:

call CRC32Checksum

在FASM中,当您将方括号括起来时,它意味着间接寻址。

“call [CRC32Checksum]”表示“调用哪个地址位于CRC32Checksum变量的过程。实际上,你会得到编译器错误”操作数大小未指定“,因为标签CRC32Checksum是代码标签,没有分配大小。(您可以使用“call dword [CRC32Checksum]”来覆盖它,但这里当然没有意义。

请注意,您通过间接调用调用导入的函数“getchar”。这是因为导入的函数实际上是包含导入函数地址的双字变量。

答案 1 :(得分:0)

Flat Assembler网站有一个关于Windows编程的指南。它有documentation如何使用proc宏制作程序。

或只是call一个标签,通过堆栈或寄存器为您提供所需的参数。