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 では、何かを角括弧で囲むと、間接アドレス指定を意味します。

「[CRC32Checksum] を呼び出す」とは、「CRC32Checksum 変数にアドレスが配置されているプロシージャを呼び出す」ことを意味します。実際には、ラベル CRC32Checksum はコード ラベルであり、サイズが割り当てられていないため、「オペランド サイズが指定されていません」というコンパイラ エラーが発生します。これは「call dword [CRC32Checksum]」を使用して行われますが、ここではもちろん意味がありません)。

インポートされた関数「getchar」を間接呼び出しで呼び出すことに注意してください。これは、インポートされた関数が実際には、インポートされた関数のアドレスを含む dword 変数であるためです。

于 2013-01-31T18:27:03.790 に答える
0

Flat Assembler Web サイトには、Windows プログラミングに関するガイドがあります。マクロを使用してプロシージャを作成する方法のドキュメントがあります。proc

callまたは、スタックまたはレジスタによって、必要に応じてルーチンにパラメーターを提供する単なるラベルです。

于 2013-01-26T18:02:41.533 に答える