1

我第一次尝试组装.. 我跳过了 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?我什至走在正确的轨道上吗?如何在汇编中声明函数?

4

2 回答 2

2

只需使用:

call CRC32Checksum

在 FASM 中,当您用方括号括起某些内容时,它意味着间接寻址。

“call [CRC32Checksum]”的意思是“调用地址位于CRC32Checksum变量的过程。实际上,你会得到编译器错误“operand size not specified”,因为标签CRC32Checksum是代码标签并且没有分配大小。(你可以覆盖这通过使用“call dword [CRC32Checksum]”,但在这里它当然没有意义)。

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

于 2013-01-31T18:27:03.790 回答
0

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

或者只是call一个标签,通过堆栈或寄存器向例程提供您想要的参数。

于 2013-01-26T18:02:41.533 回答