2013-03-03 2 views
0

Я буквально начал изучать 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 не удается собрать в этом случае?

ответ

1

В плоском режиме все адреса являются смещениями.

Оператор ADDR был добавлен в довольно недавнюю версию MASM, и, насколько я понимаю, используется исключительно с ключевым словом INVOKE. В INVOKE ADDR выполняет то же самое, что и смещение для глобальных идентификаторов, но также может вычислять относительный адрес локальной, основанной на стеке переменной (где он обычно генерирует инструкцию LEA).

 Смежные вопросы

  • Нет связанных вопросов^_^