私は文字通り MASM32 の学習を昨日始めたので、これがばかげた質問である場合はご容赦ください。
addr
との私の理解はoffset
次のとおりです。どちらも変数のメモリ アドレスを返しますが、offset
グローバル変数 (そのメモリ アドレスはアセンブル時に認識されます) でのみ機能し、グローバル変数addr
とローカル変数の両方で機能します。高水準言語のグローバル変数とローカル変数を知っています。私の理解では、.data
、.data?
、および.const
ブロックで宣言された変数はグローバルでありlocal
、プロシージャ内のキーワードで宣言された変数はローカルです。
私のコード全体は次のとおりです。
.386
.model flat, stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\user32.inc
includelib \masm32\lib\user32.lib
include \masm32\include\kernel32.inc
includelib \masm32\lib\kernel32.lib
.data
szCap db "Hello", 0 ;caption for the MessageBox
szMsg db "Hello, world!", 0 ;text for the MessageBox
.code
;Procedure for creating a MessaheBox with NULL parent and variable text
TestProcedure proc msg:dword, cap:dword
invoke MessageBox, NULL, msg, cap, MB_OK
ret
TestProcedure endp
main:
; error on these lines
push addr szCap ; C:\masm32\My files\HelloWorld.asm(35) : error A2008: syntax error : addr
push addr szMsg ; C:\masm32\My files\HelloWorld.asm(36) : error A2008: syntax error : addr
call TestProcedure
invoke ExitProcess, 0
end main
ただし、に変更addr
するoffset
と、コードは完全に機能します。addr
この場合、アセンブルに失敗するのはなぜですか?