Главная страница
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.015 c
3-69132
amik
2002-10-31 09:25
2002.11.21
Получение данных из blob-поля типа Memo


14-69564
mvg_first
2002-10-31 10:48
2002.11.21
А что случилось с клиентами для этих форумов?


4-69636
gam
2002-09-26 19:08
2002.11.21
Блокировка клавиатуры и мишы


1-69263
iguana
2002-11-11 20:10
2002.11.21
ламерский вопрос


14-69505
Forever
2002-10-01 18:25
2002.11.21
Как убрать