我第一次参加集会..我跳过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?我是否走在正确的轨道上?如何在汇编中声明函数?
答案 0 :(得分:2)
只需使用:
call CRC32Checksum
在FASM中,当您将方括号括起来时,它意味着间接寻址。
“call [CRC32Checksum]”表示“调用哪个地址位于CRC32Checksum变量的过程。实际上,你会得到编译器错误”操作数大小未指定“,因为标签CRC32Checksum是代码标签,没有分配大小。(您可以使用“call dword [CRC32Checksum]”来覆盖它,但这里当然没有意义。
请注意,您通过间接调用调用导入的函数“getchar”。这是因为导入的函数实际上是包含导入函数地址的双字变量。
答案 1 :(得分:0)
Flat Assembler网站有一个关于Windows编程的指南。它有documentation如何使用proc
宏制作程序。
或只是call
一个标签,通过堆栈或寄存器为您提供所需的参数。