Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];

Вниз

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:
 mov ax, word(offset @a - 400000h)
и тут никаких вопросов, все прокатывает, а вот с DW ну просто мрак.


 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.53 MB
Время: 0.058 c
2-1275776869
akosh12345
2010-06-06 02:27
2010.08.27
Динамическая память


2-1268839389
Knob
2010-03-17 18:23
2010.08.27
Командная строка


15-1267705960
Kolan
2010-03-04 15:32
2010.08.27
Где взять справку по TMaskEdit?


2-1269712810
ZeTToG350
2010-03-27 21:00
2010.08.27
Проблемма с окнами


2-1274079491
pro_xaoc
2010-05-17 10:58
2010.08.27
удаление последнего символа





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский