Текущий архив: 2010.08.27;
Скачать: CL | DM;
ВнизBASM в DELPHI, проблема с Offset`ами Найти похожие ветки
← →
vastani (2010-04-12 12:56) [0]приведу упрощенный вариант BASM проблемы, надеюсь решение всеже есть:
procedure proba();
asm
@a:
nop
nop
@b:
mov eax, (offset @b - offset @a)
ret
DW word( offset @b - offset @a)
end
Я привёл два места в коде (они нужны именно такими), которые ни в какую НЕ ХОТЯТ компилится как КОНСТАНТЫ, т.е. получается вроде, что BASM не в состоянии вычислить дельту между оффсетами и (offset @b - offset @a) для него неподдерживается??? Уж чего только не пробовал и скобочки дополнительные и другие извраты включая математические умножить/разделить на константу, все чушь и бред отчаяния, очень надо и вся задумка в проекте сводится на нет только от этой проблемы, ну не верится что нет выхода в ассемблерном блоке, может я не знаю просто. Почему: (offset @b - 100) - запросто, а дельта оффсетов - нет? Что не так?
← →
Rouse_ © (2010-04-12 15:39) [1]
lea eax, @b
sub eax, offset @a
← →
vastani (2010-04-12 16:03) [2]с регистрами можно попордоваться, понятно, НО таблица значений DW ...,
которые хочется "втянуть" из ассемблерных исходников (рабочих и проверенных) в процедуру делфи и как BASM дает большое разочарование... неужели никак?
Вынести DW ... в CONST скажем и оформить как ARRAY() можно, но тогда OFFSET`ы обрамлённые ASM.....END; как констаты в этот(и) массив(ы) не попадают никак... Неделю бьюсь, гуглю, рыщу, никакой зацепки не вижу.
Все статическое, готовое и проверенное рассыпается, как мечта, неужели ручками все только динамически делать, т.е. в VAR создавать, и "наливать" их вычисляя дельты через некую придуманную дополнительную инициализационную подфункцию по некому параметру.... Жжжжуть и жесть! Легче забыть, пожалуй про мечту. Нарвался я на вилы похоже.
← →
Anatoly Podgoretsky © (2010-04-12 17:09) [3]А так можно
DW word(@b - @a)
← →
vastani (2010-04-12 17:54) [4]У меня на DELPHI 7 устойчивый "Inline assembler syntax error" в данном варианте, как и в массе предыдущих интерпретаций выражения в скобках. Хоть так,
asm
@a:
nop
nop
@b:
DW ( @b - @a )
end;
хоть еще че нить, не хочет гад константу посчитать....
Быть может BASM человечески доработан на каком нибудь Delphi 2010 (CodeGear 2010)???
← →
Сергей М. © (2010-04-12 18:04) [5]
> Все статическое, готовое и проверенное рассыпается
Сотвори из "статического, готового и проверенного" obj-модуль и прилинкуй к дельфийскому проекту.
← →
Anatoly Podgoretsky © (2010-04-12 18:59) [6]
> У меня на DELPHI 7 устойчивый "Inline assembler syntax error"
> в данном варианте, как и в массе предыдущих интерпретаций
> выражения в скобках. Хоть так,
Я бы сначала написал бы как у тебя, и потом бы искал другое решение, как ты понимаешь, мне даже Дельфи запускать неохота.
← →
vastani (2010-04-12 21:54) [7]
> Сотвори из "статического, готового и проверенного" obj-модуль
> и прилинкуй к дельфийскому проекту
делал так, но... это было первым вариантом, если быть кратким не подходит b гемора своего полно тоже...
> Я бы сначала написал бы как у тебя, и потом бы искал другое
> решение
я и пишу какое решение мне нужно, сузив проблему до ЕДИНСТВЕННОЙ - получение в совокупности дельт оффсетов, как фиксированных констант в таблице значений DW ... и именно внутри ASM.......END;
Последний мой пост - уже и конкретнее дальше некуда. Нужно обеспечить компиляцию именно ОТОГО участка. Если НЕ решить этой ерунды (казалось бы), то получается мой проект и задумка лишены смысла, либо перепахивать, как камикадзе весь ASM исходник так, чтобы он "нравился" этому кастрату - BASM.
Не хочу DLL или OBJ решений, хотелось бы чтобы "все было родное" и отладчиком пошагово лазить, как у себя дома в IDE и редактировать и компилить соответственно...
← →
Sha © (2010-04-13 00:05) [8]Еще на BASMе неудобно программировать корчеватели.
Совсем плохой язык.
← →
Дмитрий Белькевич (2010-04-13 01:05) [9]
> хотелось бы чтобы "все было родное" и отладчиком пошагово
> лазить,
Зачем? Если
> рабочих и проверенных
?
← →
Германн © (2010-04-13 01:14) [10]
> Последний мой пост - уже и конкретнее дальше некуда. Нужно
> обеспечить компиляцию именно ОТОГО участка. Если НЕ решить
> этой ерунды (казалось бы), то получается мой проект и задумка
> лишены смысла, либо перепахивать, как камикадзе весь ASM
> исходник так, чтобы он "нравился"
Знакомые мучения.
Что ж. Сам взялся сам и мучайся.
← →
vastani (2010-04-13 01:44) [11]
> Зачем?
выгодный симбиоз получается. Гуишные вещи + "оформительские" компоненты, которые быстро обеспечат "солиное лицо" программы и проверенные и оптимальные процедуры на ASM, которые круто обеспечивают нужные результаты. Никогда бы не поверил, если бы сам не нарвался, что в языке программирования, которому в совокупности лет и лет... нельзя сделать такую простую вещь. Мрак.
> Сам взялся сам и мучайся.
спасибо, не привыкать к сожалению...
или к счастью: "... и опыт - сын ошибок трудных, и гений - просвещенья друг!" :D
← →
Дмитрий Белькевич (2010-04-13 01:56) [12]Под BASM нужно немного "специально" сразу писать. И всё получится. У самого с десяток процедур по несколько (кое-где десятков) листов, mmx. И тогда получишь все прелести среды в одном флаконе. Ну а в твоём случае - ассемблер - в obj. Если уже всё отлажено, то и ладно. В любом случае под отладчиком будет доступен весь obj, как есть, только что без синхронизации с отображением сырцов и без их быстрой пересборки. Но если всё уже и так работает - то и пофиг.
← →
vastani (2010-04-14 12:13) [13]Оказывается дело в BASMе ещё хуже чем я думал.
Даже это нельзя скомпилить:asm
@a:
DW @a
end;
илиasm
@a:
DW offset @a
end;
илиasm
@a:
DW word ( offset @a )
end;
может я совсем туплю? Подскажите где я не прав? Я так понимаю BASM понимает offset только как Pointer (DWORD) хоть убейся и все, как его заставить взять в DW хотябы младшую часть, которая WORD?
← →
Anatoly Podgoretsky © (2010-04-14 12:25) [14]> vastani (14.04.2010 12:13:13) [13]
DWORD = DD
← →
Anatoly Podgoretsky © (2010-04-14 12:26) [15]> vastani (14.04.2010 12:13:13) [13]
Смещение тоже размером в DWORD, никаких вордов, они погибли с 16 битными ОС
← →
Сергей М. © (2010-04-14 12:30) [16]
> vastani (14.04.10 12:13) [13]
Ты забываешь два важных факта:
1. Дельфийский компилятор однопроходный.
2. В секциях и кода и данных он генерирует абсолютные адреса.
← →
vastani (2010-04-14 13:37) [17]ну пусть однопроходный, почему то это:
@a:
DD word(offset @a - 400000h)
компилятор очень даже скушал, хоть и однопроходный...
а вот даже так НЕТDW word( 112233h )
:
← →
vastani (2010-04-14 13:42) [18]
@a:
и тут никаких вопросов, все прокатывает, а вот с DW ну просто мрак.
mov ax, word(offset @a - 400000h)
← →
Anatoly Podgoretsky © (2010-04-14 13:42) [19]Потому что DW word( 112233h ): - это недопустимая команда, а вот почему не обругал при компиляции не знаю.
И эта команда DW word( offset @b - offset @a) тоже недопустимая.
← →
Сергей М. © (2010-04-14 14:17) [20]
> почему то это:
> @a:
> DD word(offset @a - 400000h)
> компилятор очень даже скушал, хоть и однопроходный
Видимо потому что разрядность операнда 400000h явно определяет разрядность операции offset @a - 400000h, в то время как при offset @a - offset @b при первом и единственном проходе компилятор не может ее определить.
← →
vastani (2010-04-14 14:33) [21]вариант вида:
@a:
mov eax, offset @a
sub eax, 401000h
и вариант соответственно:@a:
mov ax, word(offset @a - 401000h)
полностью идентичны по ФАКТИЧЕСКИМ WORD значениям в AX регистре. Поскольку значение справа WORD, успешно получено и передано компилятором, то делаю налогично, но с DW :DW word(offset @a - 401000h)
ругается падла "Constant expected"
А вариант:DD word(offset @a - 401000h)
кушает запросто, и правильное значение содержит конечно.
Вот DW неродное ему хоть тресни...
← →
Anatoly Podgoretsky © (2010-04-14 14:36) [22]> Сергей М. (14.04.2010 14:17:20) [20]
А надо не гадать, а брать рукодство с сервера Интела, BASM работает на ее основе и только немного своих заморочек в синтаксисе, он и Паскаль и Интел АСМ одновременно. А в FPC еще и ATT синтаксис.
← →
Anatoly Podgoretsky © (2010-04-14 14:38) [23]> vastani (14.04.2010 14:33:21) [21]
Не индетичны, ворд и дабл ворд. И может ему нужне не word, a word ptr
← →
Anatoly Podgoretsky © (2010-04-14 14:44) [24]
OFFSET Returns the offset part (double word) of the expression following the operator. The result is an immediate value.
PTR Typecast operator. The result is a memory reference with the value of the expression following the operator and the type of the expression in front of the operator.
← →
vastani (2010-04-14 14:59) [25]поскольку из памяти значение не берется, как с ячейки, то PTR не канает.
Ладно оcnfdbv OFFSET`ы вообще в покое, проверяю дебильность компилятора еще конкретнее и дебильнее так:DD dword(word( 112233h ))
DW word(dword( 112233h ))
ну и что? А вот первая строка и скомпилилась и содержит верное значение, т.е. именно 2233h как и читается глазами и мозгом размышляется, как логичное, а вторая ВООБЩЕ НИ В КАКУЮ! Какого хрена эта падла из DWORD взять WORD? Ему для этого даже вычислять ничего не надо и дополнять тоже... недоумение одно. Ну более конкретного и явного я не могу придумать. По-моему этим последним примером видна явная недоработка, ведь ничего противоестественного и "незаконного" я не сделал и по логике рассуждая, раз он первую "умеет обработать", то почему со вротой проблема?
← →
Anatoly Podgoretsky © (2010-04-14 15:09) [26]> vastani (14.04.2010 14:59:25) [25]
PTR ни какого отношения к указателям не имеет, это приведение типа, я же привел цитату из справки
← →
Anatoly Podgoretsky © (2010-04-14 15:11) [27]> vastani (14.04.2010 14:59:25) [25]
Возможно она не знает, какую половину брать, попробуй применить HIGH/LOW но это изучение методом тыка, вместо чтения документации.
← →
vastani (2010-04-14 15:27) [28]Конкретная по BASMу дока отсутствует, то что скачал жалкое подобие и печальное зрелище, типа для начинающих примеры a+b=c, HELP для DELPHI вполне такой же по информативности...
HIGH/LOW "лепил" нифига не дпет результата. А вот тупой он тупой, но вмеру ведь, в одном случае он и приводит и конверит в другом нет. Вот еще последние мозготерзания перед тем как начертить жирный крест:
DW word ( 112233h and 0ffffh)
DW word ( 112233h - 110000h )
DW word ( 112233h )
первые два сверху и приводятся типы и усекается правильно и берет именно младшую часть и помещает её в DW, а последний неееее, типа на же мне совсем не родная, это жеж констата явная, типа очень большие трудности ее понять как кушать, блин!
← →
oxffff © (2010-04-14 15:43) [29]
> Конкретная по BASMу дока отсутствует
Assembly Expressions (Win32 Only)
The built-in assembler evaluates all expressions as 32-bit integer values
Страницы: 1 вся ветка
Текущий архив: 2010.08.27;
Скачать: CL | DM;
Память: 0.52 MB
Время: 0.07 c