0

私は文字通り 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この場合、アセンブルに失敗するのはなぜですか?

4

1 に答える 1

1

フラット モードでは、すべてのアドレスがオフセットになります。

ADDR 演算子はかなり最近のバージョンの MASM に追加されたもので、私が理解している限り、INVOKE キーワードでのみ使用されます。INVOKE では、ADDR はグローバル識別子のオフセットと同じことを行いますが、ローカルのスタックベース変数の相対アドレスも計算できます (通常、LEA 命令を発行する場所)。

于 2013-03-05T21:09:51.493 に答える