Я буквально начал изучать MASM32 вчера, так что несите меня, если это глупый вопрос.вызов addr на глобальную переменную, которая не собирается собираться в 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
не удается собрать в этом случае?