Подскажите пожалуйста.
Как можно передавать строки, или данные в правую точку из цикла?
например:
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;
Этот топик читают: Гость
Ответов: 2059
Рейтинг: 132
|
|||
карма: 6 |
|
Ответов: 9906
Рейтинг: 351
|
|||
Видите ли, уважаемый flint2...
Крайне затруднительно корректно ответить на вопрос, иллюстрированный некими надписями, неподдающимися расшифровке |
|||
карма: 9 |
|
Ответов: 2059
Рейтинг: 132
|
|||
Попытаюсь расшифровать.
Есть некоторая функция/процедура описанная через ассемблер. Эта функция содержит цикл. Так вот, можно ли из этого цикла выводить данные в правую точку. Т.е. call из цикла - вызов прцедуры (вопрос какой?), которая передаст значение EAX или параметр лежащий на стеке в правую точку и вызовет событие (событие то же в цикле). |
|||
карма: 6 |
|
Ответов: 9906
Рейтинг: 351
|
|||
Попытаюсь тоже расшифровать
Слова есть слова. А код есть код. Так вот, приведенное Вами не есть код. Не более, чем наскальная надпись. К сожалению. Приведите нормальный (не считая Вашего Call) и сразу станет понятно, что Вам ответить |
|||
карма: 9 |
|
Ответов: 8960
Рейтинг: 824
|
|||
flint2, а вот мнение диалетанта (моё): поскольку ассемблер родился гораздо раньше, одновременно с "ЭВМ", то в нём не может быть HiAsm-овских точек ни справа, ни слева, то
flint2 писал(а): Или только как то так?
Procedure THiAsmClass.doWork; begin Par1:= ReadInteger(_Data,Param1); _hi_OnEvent(onEvent,Name(Par1)); end; ![]() |
|||
карма: 19 |
|
Ответов: 2059
Рейтинг: 132
|
|||
Где начало того конца, которым оканчивается начало?
Как же я могу написать работающий код, когда вопрос в нем и заключается. Вот код схемы, если так можно сказать. 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 |
| ||
файлы: 2 | code_31629.txt [2KB] [369], code_31630.txt [1.4KB] [373] |
Ответов: 9906
Рейтинг: 351
|
|||
flint2 писал(а): Там ассемблер нормальный.Неправда. Там ассемблер кривой. Он читает данные ниже стека (боцман, за такое - бил канделябрами по голове) Но хотя бы читаемый... Вызвать правую точку можно так:
------------ Дoбавленo в 12.20: На будущее: стиль представления Вами данных является совершенно неприемлемым. И таковой будет оставаться без ответа в последствии. Можете мои данные взять за образец (за приемлемый стиль) |
|||
карма: 9 |
| ||
Голосовали: | Леонид |
Ответов: 2059
Рейтинг: 132
|
|||
Неправда. Там ассемблер кривой. Он читает данные ниже стека (боцман, за такое - бил канделябрами по голове)
Но хотя бы читаемый... А до 6 версии половину команд не понимает. Если дело на то пошло, то вообще моя оценка BASM - ниже плинтуса. Но что делать?! На безрыбье и ... За ответ спасибо! |
|||
карма: 6 |
|
Ответов: 9906
Рейтинг: 351
|
|||
PC-архитектура - дурдом на каникулах. Это - ДА, создает реальные интеллектуальные проблемы.
А BASM там, или что другое... не самое принципиальное. Не сложнее какого-нидуь до-диеза. flint2 писал(а): Но что делать?! На безрыбье и ...При таком подходе есть большой риск остаться лохом на всю жизнь Заразная это болезнь - делать чего-то без понимания, как это работает. Некоторые всю жизнь переучиться не могут ![]() BTW: добавил немного комментариев в пост выше... |
|||
карма: 9 |
|
Ответов: 2059
Рейтинг: 132
|
|||
За коментарии спасибо.
Правда я с первого взгляда разобрался. При таком подходе есть большой риск остаться лохом на всю жизнь
Заразная это болезнь - делать чего-то без понимания, как это работает. Некоторые всю жизнь переучиться не могут А вот этого не понял. Алтернативы ведь нет! На счёт понимания, как работает Басм в дельфи есть. И все изъяны извесны. А если по поводу кода, то там вначале дополнительный стек организован. Конечно можно было сделать всё лаконичней, но дело в том, что ассемблерный код генерируется из скрипта на Форте. Поэтому автоматом генерируется вход и выход из форта. Пока целевой компилятор-транслятор для 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 |
|
10