Главная страница
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.012 c
14-69577
Shrek
2002-11-04 23:49
2002.11.21
ну и западло


6-69483
TCrash
2002-09-25 15:33
2002.11.21
Спецификация POP3


1-69376
Ученик
2002-11-10 12:23
2002.11.21
31 число в какой декаде


14-69507
paren'
2002-11-01 23:23
2002.11.21
Есть шансы, как вы думаете?


14-69541
easy
2002-10-31 17:22
2002.11.21
Очень расслабляет после рабочего дня...