Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

BASM в DELPHI, проблема с Offset`ами [D7]


Страницы:   1 2

vastani ©   (2010-04-12 12:56:00) 

приведу упрощенный вариант 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) - запросто, а дельта оффсетов - нет? Что не так?


oxffff   (2010-04-14 15:43:00) [1]


> Конкретная по BASMу дока отсутствует


Assembly Expressions (Win32 Only)
The built-in assembler evaluatesall expressions as 32-bit integer values


vastani   (2010-04-14 15:27:00) [2]

Конкретная по BASMу дока отсутствует, то что скачал жалкое подобие и печальное зрелище, типа для начинающих примеры a+b=c, HELP для DELPHI вполне такой же по информативности...
HIGH/LOW "лепил" нифига не дпет результата. А вот тупой он тупой, но вмеру ведь, в одном случае он и приводит и конверит в другом нет. Вот еще последние мозготерзания перед тем как начертить жирный крест:

DW word ( 112233h and 0ffffh)
DW word ( 112233h - 110000h )
DW word ( 112233h )

первые два сверху и приводятся типы и усекается правильно и берет именно младшую часть и помещает её в DW, а последний неееее, типа на же мне совсем не родная, это жеж констата явная, типа очень большие трудности ее понять как кушать, блин!


Anatoly Podgoretsky   (2010-04-14 15:11:00) [3]

> vastani  (14.04.2010 14:59:25)  [25]

Возможно она не знает, какую половину брать, попробуй применить HIGH/LOW но это изучение методом тыка, вместо чтения документации.


Anatoly Podgoretsky   (2010-04-14 15:09:00) [4]

> vastani  (14.04.2010 14:59:25)  [25]

PTR ни какого отношения к указателям не имеет, это приведение типа, я же привел цитату из справки


vastani   (2010-04-14 14:59:00) [5]

поскольку из памяти значение не берется, как с ячейки, то PTR не канает.
Ладно оcnfdbv OFFSET`ы вообще в покое, проверяю дебильность компилятора еще конкретнее и дебильнее так:
DD dword(word( 112233h ))
DW word(dword( 112233h ))

ну и что? А вот первая строка и скомпилилась и содержит верное значение, т.е. именно 2233hкак и читается глазами и мозгом размышляется, как логичное, а вторая ВООБЩЕ НИ В КАКУЮ! Какого хрена эта падла из DWORD взять WORD? Ему для этого даже вычислять ничего не надо и дополнять тоже... недоумение одно. Ну более конкретного и явного я не могу придумать. По-моему этим последним примером видна явная недоработка, ведь ничего противоестественного и "незаконного" я не сделал и по логике рассуждая, раз он первую "умеет обработать", то почему со вротой проблема?


Anatoly Podgoretsky   (2010-04-14 14:44:00) [6]

OFFSET Returns the offset part ( double word)of the expression following the operator. The result is an immediate value.

PTRTypecast 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.


Anatoly Podgoretsky   (2010-04-14 14:38:00) [7]

> vastani  (14.04.2010 14:33:21)  [21]

Не индетичны, ворд и дабл ворд. И может ему нужне не word, a word ptr


Anatoly Podgoretsky   (2010-04-14 14:36:00) [8]

> Сергей М.  (14.04.2010 14:17:20)  [20]

А надо не гадать, а брать рукодство с сервера Интела, BASM работает на ее основе и только немного своих заморочек в синтаксисе, он и Паскаль и Интел АСМ одновременно. А в FPC еще и ATT синтаксис.


vastani   (2010-04-14 14:33:00) [9]

вариант вида:
@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 неродное ему хоть тресни...


Сергей М.   (2010-04-14 14:17:00) [10]


> почему то это:
> @a:
> DD word(offset @a - 400000h)
> компилятор очень даже скушал, хоть и однопроходный


Видимо потому что разрядность операнда 400000h явно определяет разрядность операции offset @a - 400000h, в то время как при offset @a - offset @b при первом и единственном проходе компилятор не может ее определить.


Anatoly Podgoretsky   (2010-04-14 13:42:00) [11]

Потому что DW word( 112233h ): - это недопустимая команда, а вот почему не обругал при компиляции не знаю.
И эта команда   DW word( offset @b - offset @a) тоже недопустимая.


vastani   (2010-04-14 13:42:00) [12]

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


vastani   (2010-04-14 13:37:00) [13]

ну пусть однопроходный, почему то это:
@a:
DD word(offset @a - 400000h)

компилятор очень даже скушал, хоть и однопроходный...
а вот даже так НЕТ DW word( 112233h ):


Сергей М.   (2010-04-14 12:30:00) [14]


> vastani   (14.04.10 12:13) [13]


Ты забываешь два важных факта:

1. Дельфийский компилятор однопроходный.
2. В секциях и кода и данных он генерирует абсолютныеадреса.


Anatoly Podgoretsky   (2010-04-14 12:26:00) [15]

> vastani  (14.04.2010 12:13:13)  [13]

Смещение тоже размером в DWORD, никаких вордов, они погибли с 16 битными ОС


Anatoly Podgoretsky   (2010-04-14 12:25:00) [16]

> vastani  (14.04.2010 12:13:13)  [13]

DWORD = DD


vastani   (2010-04-14 12:13:00) [17]

Оказывается дело в 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?


Дмитрий Белькевич   (2010-04-13 01:56:00) [18]

Под BASM нужно немного 'специально' сразу писать. И всё получится. У самого с десяток процедур по несколько (кое-где десятков) листов, mmx. И тогда получишь все прелести среды в одном флаконе. Ну а в твоём случае - ассемблер - в obj. Если уже всё отлажено, то и ладно. В любом случае под отладчиком будет доступен весь obj, как есть, только что без синхронизации с отображением сырцов и без их быстрой пересборки. Но если всё уже и так работает - то и пофиг.


vastani   (2010-04-13 01:44:00) [19]


> Зачем?
выгодный симбиоз получается. Гуишные вещи + "оформительские" компоненты, которые быстро обеспечат "солиное лицо" программы и проверенные и оптимальные процедуры на ASM, которые круто обеспечивают нужные результаты. Никогда бы не поверил, если бы сам не нарвался, что в языке программирования, которому в совокупности лет и лет... нельзя сделать такую простую вещь. Мрак.

> Сам взялся сам и мучайся.

спасибо, не привыкать к сожалению...
или к счастью: "... и опыт - сын ошибок трудных, и гений - просвещенья друг!" :D


Германн   (2010-04-13 01:14:00) [20]


> Последний мой пост - уже и конкретнее дальше некуда. Нужно
> обеспечить компиляцию именно ОТОГО участка. Если НЕ решить
> этой ерунды (казалось бы), то получается мой проект и задумка
> лишены смысла, либо перепахивать, как камикадзе весь ASM
> исходник так, чтобы он "нравился"

Знакомые мучения.
Что ж. Сам взялся сам и мучайся.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо