· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.ASSEMBLER —› ADDR и OFFSET

. 1 . 2 . >>

Посл.отвђт Сообщенiе


Дата: Ноя 10, 2003 11:46:36

Нужно в ячейку памяти загрузить адрес строки, когда использую ADDR - компилятор выдаёт ошибку, использую OFFSET - всё нормально. Но потом когда я через invoke передаю адрес строки API, получаеться ошибка.


Дата: Ноя 10, 2003 11:51:02 · Поправил: q_q

Какую ошибку выдает компилятор?
Какая ошибка получается при передачи адреса строки?

Покажи код.


Дата: Ноя 10, 2003 12:00:04

q_q
Кода с собой нету, проблема в том что как я понял invoke или API не поддерживают OFFSET, хотелось бы узнать разницу между ними. Знаю что OFFSET - выдаёт адрес относительно начала сегмента данных, а ADDR - незнаю...


Дата: Ноя 10, 2003 12:05:47

Простите за неточность ошибку выдаёт компоновщик.


Дата: Ноя 10, 2003 12:36:54

Chib777
invoke прекрасно понимает offset
afaik offset в результате выдает константу, а addr преобразуется с использованием lea и используется, например, для адресации переменных расположенных в стеке.


Дата: Ноя 10, 2003 12:45:56

q_q
Спасибо, буду эксперементировать...


Дата: Ноя 11, 2003 06:08:17

Могу только добавить, что по возможности нужно стараться использовать OFFSET.

ЗЫ: Пора добавлять этот вопрос в FAQ, наверное :-)


Дата: Июл 20, 2004 19:22:23

вообще-то addr компилер преобразует в
lea eax, что-то...
push eax
что в общем-то применимо к локальным переменным, а к глобальным можно смещение(то бишь offset применять),
и выражается это в
push offset чего-то там...
, что явно короче lea+push,
а насчет того, что лучше использовать offset вместо addr,
незнаю, это только правильно в том случае, если у масма компилер полный дебил, и не отличает глабальных переменных от локальных, но думаю, что с этим проблем нет...
Хотя думаю, что Quantum в этом деле явно умнее меня.
Вот и думай, кому верить, IDA PRO, или кому-то еще...


Дата: Июл 20, 2004 20:41:57

art
masm умеет отличать данные в стеке от данных глобальных и совершенно справедливо превращает addr в offset в последнем случае, но злоупотреблять макросом addr не есть хорошо, т.к. приводит к возникновению вопросов вроде сабжевого.


Дата: Июл 30, 2004 15:05:32

>но злоупотреблять макросом addr не есть хорошо, т.к.
приводит к возникновению вопросов вроде сабжевого.

неконкретно :))
в каком случае это происходит?
addr работает только с директивой invoke
а не в виде lea eax, addr label1
я знаю только один момент когда addr
не сработает в директиве invoke:
если передаваемая переменная находится ниже (в коде).
пример:
invoke func, addr label
label db "addr",0


Дата: Июл 30, 2004 19:49:01

jabber
„invoke func, addr label
label db "addr",0“

Можно проще:
    jmp @F
@label:
    db "addr",0
@@: invoke func,@label


„я знаю только один момент когда addr
не сработает в директиве invoke“

Или если в другом параметре (левее от addr) используется eax.


Дата: Июл 30, 2004 20:30:47

>Можно проще:
можно только где здесь исп-ние addr?
если просто показать что есть такой вариант
то я знаю.
есть ещё макрос такой если не знаете:
szText MACRO Name, Text:VARARG
LOCAL lbl
jmp lbl
Name db Text,0
lbl:
ENDM
>Или если в другом параметре (левее от addr) используется eax.
а это у меня не работает в смысле в этом случае addr срабатывает.


Дата: Июл 30, 2004 21:15:33

Вопрос про ADDR/OFFSET уже пора в FAQ заносить


Дата: Июл 30, 2004 21:24:48

А можно и так:
     call   @f
     db "addr", 0
@@:  call   func


Дата: Июл 31, 2004 06:19:13

jabber
„можно только где здесь исп-ние addr?“
О! Это чтобы показать что иногда он вообще не нужен.

„а это у меня не работает в смысле в этом случае addr срабатывает.“
Компилятор должен выдать ошибку:
error A2133: register value overwritten by INVOKE
Но только если addr транслируется в lea.

vaskovich
Оригинально :-)

. 1 . 2 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.098