Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.11.21;
Скачать: CL | DM;

Вниз

Как получить результат из asm-процедуры, скажем, в строку?   Найти похожие ветки 

 
RV ©   (2002-11-04 09:56) [0]

Вот, читаю:

Функция PlusMinusLine возвращает длинную строку, состоящую из последовательности плюсов и минусов, для формирования строки. Например, когда вы напишите так S:=PlusMinusLine(9), то S должна получить значение: "-+-+-+-+-".
Декларация функции следующая:
function PlusMinusLine(L: Integer): AnsiString; register;
Функция принимает один параметр: длину строки символов (L). Поскольку мы используем соглашение по умолчанию, то параметр передается через регистр EAX. Функция должна вернуть длинную строку, Что в действительности означает указатель на область памяти, содержащей нашу строку. Вы можете использовать переменную Result для обращения к этой области, но поскольку ее поведение аналогично var, то в этом случае @Result эквивалентно регистру EDX (второй параметр отдельной функции передается через регистр EDX, при использования соглашения register)!


function PlusMinusLine(L: Integer): AnsiString; register;
asm
push EDI
push ESI
push EBX
mov ESI,EDX {Указатель памяти на Result}
mov EBX,EAX {EBX хранит длину параметра}
call System.@NewAnsiString
mov EDI,EAX {EDI используется для заполнения строки}
mov [ESI],EDI
mov ECX,EBX
shr ECX,2 {обрабатываем по 4 байта за раз}
test ECX,ECX
jz @@remain
mov EAX,"+-+-"
@@loop:
mov [EDI],EAX
add EDI,4
dec ECX
jnz @@loop
@@remain: {заполняем оставшие байты, если length/4 не ноль}
mov ECX,EBX
and ECX,3
jz @@ending
mov EAX,"+-+-"
@@loop2:
mov BYTE PTR [EDI],al
shr EAX,8
inc EDI
dec ECX
jnz @@loop2
@@ending:
mov EAX,ESI {для совместимости: возврат указателя через EAX}
pop EBX
pop ESI
pop EDI
end;


Вопрос.
Как мне получить в S(тип string) результат работы этой функции?
Теорию я читал, но не понял. Хочется посмотреть код (код с коментариями, имхо, сам пояснит теорию, края пояснит дальнейшее :))


 
RV ©   (2002-11-04 10:14) [1]

да, и главное, почему
label1.Caption:=PlusMinusLine(9);
работает?



Страницы: 1 вся ветка

Текущий архив: 2002.11.21;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.017 c
14-69514
Dimich1978
2002-11-02 09:08
2002.11.21
Где мона взять иконки разрешением 16x16


3-69191
ruslan_as
2002-11-01 11:11
2002.11.21
обновить одну запись


14-69565
Cr@sh
2002-11-04 13:54
2002.11.21
Помогите!


7-69606
DMdeveloper
2002-09-14 18:57
2002.11.21
Работа с USB устройством.


1-69311
iNew
2002-11-12 16:34
2002.11.21
Кто пользовался компонентой AsyncPro отзовитесь.