Если я не ошибаюсь, то использованием, offset используется в "читом" асме, вроде: Код (Text): push MB_OK push offset ofcation push offset oftext push 0 call MessageBox , ADDR - в invoke: invoke MessageBox, NULL, ADDR oftext, ADDR ofcation, MB_OK
addr используется в invoke для адресации локальных переменных чезер регистр eax (в masm). Пример: Код (Text): szError db 'Error!', 0 szFmt db 'Error #%x', 0 ... local szMsg[0x100]:BYTE ... invoke GetLastError invoke wsprintf, addr szMsg, offset szFmt, eax invoke MessageBox, 0, addr szMsg, offset szError, MB_OK будет переведено в: Код (Text): call GetLastError push eax push offset szFmt lea eax, [szMsg] push eax call wsprintf add esp, 3*4 push MB_OK push offset szError lea eax, [szMsg] push eax push 0 call MessageBox
т.е. если кратко, то offset Для переменных, которые на всю програму, а addr, для тех, которые как LOCAL описаны?
нет. offset для уже определенных переменных. addr для переменных которые могут идти уже после обращения к ним. пример Код (Text): var1 db 1 mov eax, offset var1 mov ebx, addr var2 var2 db2
n0name наоборот в invoke offset может адресовать ещё не описанные переменные, а addr нет, зато addr может адресовать локальные переменные в стеке, автоматически добавляя lea, а offset этого не умеет А без invoke addr вообще не работает, во всяком случае в масме.
Lex2029 addr тоже для всех, но только если они описаны ранее. И вообще, addr — примочка для invoke, чтобы читабельнее и удобнее код был.