Вверх ↑
Этот топик читают: Гость
Ответов: 2059
Рейтинг: 132
#1: 2013-08-21 18:46:17 ЛС | профиль | цитата
Подскажите пожалуйста.
Как можно передавать строки, или данные в правую точку из цикла?
например:
function Name(Param1:Integer):Integer; pascal;
asm
MOV [EBP -4], EAX
MOV [EBP -8], $A
MOV EAX , $5
MOV EDX , $80000000
SUB EDX , [EBP -8]
LEA EBX , [EDX ][EAX ]
MOV EAX , [EBP -4]
PUSH , OFFSET [@574BD3]
PUSH EDX
PUSH EBX
XCHG EAX, EAX
@574BB8:MOV [EBP -4]EAX \ начало цикла
MOV EAX , [ESP ]
SUB EAX , [ESP +4]
LEA EBP , [EBP -4]
CALL вывод в правую точку
INC [ESP ]
JNO @574BB8
LEA ESP , [ESP +12]
@574BD3:RET \ конец цикла
end;

Или только как то так?
Procedure THiAsmClass.doWork;
begin
Par1:= ReadInteger(_Data,Param1);
_hi_OnEvent(onEvent,Name(Par1));

end;
карма: 6

0
Ответов: 9906
Рейтинг: 351
#2: 2013-08-21 19:05:15 ЛС | профиль | цитата
Видите ли, уважаемый flint2...

Крайне затруднительно корректно ответить на вопрос, иллюстрированный некими надписями, неподдающимися расшифровке

карма: 9

0
Ответов: 2059
Рейтинг: 132
#3: 2013-08-21 19:33:15 ЛС | профиль | цитата
Попытаюсь расшифровать.
Есть некоторая функция/процедура описанная через ассемблер.
Эта функция содержит цикл.
Так вот, можно ли из этого цикла выводить данные в правую точку.
Т.е. call из цикла - вызов прцедуры (вопрос какой?), которая передаст значение EAX или параметр лежащий на стеке в правую точку и вызовет событие (событие то же в цикле).
карма: 6

0
Ответов: 9906
Рейтинг: 351
#4: 2013-08-21 21:18:53 ЛС | профиль | цитата
Попытаюсь тоже расшифровать

Слова есть слова. А код есть код.
Так вот, приведенное Вами не есть код. Не более, чем наскальная надпись. К сожалению.
Приведите нормальный (не считая Вашего Call) и сразу станет понятно, что Вам ответить
карма: 9

0
Ответов: 8960
Рейтинг: 824
#5: 2013-08-21 23:31:56 ЛС | профиль | цитата
flint2, а вот мнение диалетанта (моё): поскольку ассемблер родился гораздо раньше, одновременно с "ЭВМ", то в нём не может быть HiAsm-овских точек ни справа, ни слева, то
flint2 писал(а):
Или только как то так?
Procedure THiAsmClass.doWork;
begin
Par1:= ReadInteger(_Data,Param1);
_hi_OnEvent(onEvent,Name(Par1));
end;

карма: 19

0
Ответов: 2059
Рейтинг: 132
#6: 2013-08-21 23:35:19 ЛС | профиль | цитата
Где начало того конца, которым оканчивается начало?
Как же я могу написать работающий код, когда вопрос в нем и заключается.
Вот код схемы, если так можно сказать.
code_31629.txt
Вот код самого IC
code_31630.txt
Компилировать delphi7!!!
Там ассемблер нормальный.
IC просто выводит строку 'example1'.
Сейчас делается так:
...
Procedure THiAsmClass.doWork;
begin
Name1(Param1);
_hi_OnEvent(onEvent,Par2);
end;
Смотри IC.
Нужно:
...
@@Name1:
....
начало цикла
чего то делаем
CALL В функцю (Name2), которая выведет парпметр в onEvent, допустим объявленную так: (но так не работает.)
// Name2(Param1);
// begin
// _hi_OnEvent(onEvent,Par2);
// end;
конец цикла
Procedure THiAsmClass.doWork;
begin
Name1(Param1);
end;


карма: 6

0
файлы: 2code_31629.txt [2KB] [369], code_31630.txt [1.4KB] [373]
Ответов: 9906
Рейтинг: 351
#7: 2013-08-22 12:20:10 ЛС | профиль | цитата
flint2 писал(а):
Там ассемблер нормальный.

Неправда. Там ассемблер кривой. Он читает данные ниже стека (боцман, за такое - бил канделябрами по голове)
Но хотя бы читаемый...

Вызвать правую точку можно так:

Add(Edit,12747185,231,105)
{
Left=105
Top=110
Width=215
Text=""
}
Add(Edit,9832808,98,105)
{
Left=105
Top=15
Width=215
Text="111111111111"
link(onChange,15830079:doWork,[])
}
Add(InlineCode,15830079,168,105)
{
WorkPoints=#6:doWork|
EventPoints=#7:onEvent|
DataPoints=#6:Param1|0:|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|21:uses kol,Share,Debug;|0:|4:type|28: THiAsmClass = class(TDebug)|10: private|8: |9: public|26: Param1: THI_Event; |24: onEvent: THI_Event; |50: procedure doWork(var _Data:TData; Index:Word); |6: end; |0:|14:implementation|0:|46:procedure Name1(Event:THI_Event; str:string); |3:asm|57: PUSH esi // сохраняем неприкасаемый регистр|16: XOR ecx, ecx|75:// резервирование памяти под TData (там есть указатели => нули обязательны)|11: PUSH ecx|11: PUSH ecx|11: PUSH ecx|11: PUSH ecx|11: PUSH ecx|11: PUSH ecx|11: PUSH ecx|37:// заполняем TData нужной информацией|81: MOV [esp].TData.sdata, edx // собственно строка (второй аргумент лежит в edx)|43: MOV byte[esp].TData.Data_type, data_str|34:// ...............................|41:// ..... делаем чего-нибудь нужное |34:// ...............................|23:// делаем вызов Event-а|81: MOV esi, eax // Адрес структуры THI_Event (первый аргумент лежит в eax)|56: MOV eax, [esi+4] // Адрес Self (первый аргумент)|63: MOV edx, esp // Адрес _Data (второй аргумент) |56: MOV cx, [esi+8] // Index (третий аргумент)|51: CALL dword[esi] // Вызов метода объекта Self|34:// ...............................|41:// ..... делаем чего-нибудь нужное |34:// ...............................|59:// сборка автомата производится в порядке обратном разборке|40: ADD esp, 28 // убираем TData|63: POP esi // восстанавливаем неприкасаемый регистр|5: RET|4:end;|0:|29:procedure THiAsmClass.doWork;|13:var S:string;|5:begin|33: S := ReadString(_Data, Param1);|20: Name1(onEvent, S);|4:end;|0:|4:end.|
link(onEvent,12747185:doText,[])
}


------------ Дoбавленo в 12.20:
На будущее: стиль представления Вами данных является совершенно неприемлемым.
И таковой будет оставаться без ответа в последствии.
Можете мои данные взять за образец (за приемлемый стиль)
карма: 9

1
Голосовали:Леонид
Ответов: 2059
Рейтинг: 132
#8: 2013-08-22 13:08:10 ЛС | профиль | цитата
Неправда. Там ассемблер кривой. Он читает данные ниже стека (боцман, за такое - бил канделябрами по голове)
Но хотя бы читаемый...

А до 6 версии половину команд не понимает.
Если дело на то пошло, то вообще моя оценка BASM - ниже плинтуса. Но что делать?! На безрыбье и ...
За ответ спасибо!

карма: 6

0
Ответов: 9906
Рейтинг: 351
#9: 2013-08-22 16:44:15 ЛС | профиль | цитата
PC-архитектура - дурдом на каникулах. Это - ДА, создает реальные интеллектуальные проблемы.
А BASM там, или что другое... не самое принципиальное. Не сложнее какого-нидуь до-диеза.

flint2 писал(а):
Но что делать?! На безрыбье и ...

При таком подходе есть большой риск остаться лохом на всю жизнь
Заразная это болезнь - делать чего-то без понимания, как это работает. Некоторые всю жизнь переучиться не могут


BTW: добавил немного комментариев в пост выше...

карма: 9

0
Ответов: 2059
Рейтинг: 132
#10: 2013-08-23 02:58:18 ЛС | профиль | цитата
За коментарии спасибо.
Правда я с первого взгляда разобрался.
При таком подходе есть большой риск остаться лохом на всю жизнь
Заразная это болезнь - делать чего-то без понимания, как это работает. Некоторые всю жизнь переучиться не могут

А вот этого не понял.
Алтернативы ведь нет!
На счёт понимания, как работает Басм в дельфи есть.
И все изъяны извесны.
А если по поводу кода, то там вначале дополнительный стек организован.
Конечно можно было сделать всё лаконичней, но дело в том, что ассемблерный код генерируется из скрипта на Форте.
Поэтому автоматом генерируется вход и выход из форта.
Пока целевой компилятор-транслятор для SPF вылизываю.
Что касаемо Hiasm'а, то тут не спорю, иначе и вопросы бы не задавал.
Так что не совсем понятно, чему переучиваться?
P.S. А то что все строки в кучу, то не моя вина. Так сайт форматирует.
В тексте всё пучком.
Наверное как то можно это обойти,пока не знаю как.


------------ Дoбавленo в 02.58:
Получилось масло маслянное.
Вот мой вариант:
...
Procedure THiAsmClass.doWork;
begin
\\ зто не нужно Name1(Param1);
_hi_OnEvent(onEvent,Par2);
end;

Вот Ваш вариант:
...
procedure THiAsmClass.doWork;
var S:string;
begin
\\ зто не нужно S := ReadString(_Data, Param1);
Name1(onEvent, S);
end;

По сути произошла замена _hi_OnEvent(onEvent,Par2); на Name1(onEvent, S);
Тогда вопрос такой - откуда можно прочитать адрес onEvent?
Весь смысл в том, что Name1 (в терминах примеров) может быть функцией или процедурой со множеством параметров.
И выводить сообщения или каким то образом обработанные строки.
Во входных параметрах "OnEvent" не должно быть.
Единственное что пока на ум приходит сделать так:
Допустим существует некая вычислительная функция Name2, а вывод в правую точку через call Name1, которую Вы привели в качестве примера.
Меняя параметр onEvent1, onEvent2,..., можно выводить в разные точки.


карма: 6

0
10
Сообщение
...
Прикрепленные файлы
(файлы не залиты)