|
|
| Посл.отвђт | Сообщен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 Оригинально :-) |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.098 |