Посмотрите, пожалуйста. Где ошибка?
Код:
unit Unit1;
. . .
{$R *.dfm}
function MyStr(X: Integer): string;
asm
mov eax, X
push eax // сохраняем регистры - входной аргумент, который содержит число
push edx // сохраняем регистры - сюда заносится адрес строкового массива
push esi // сохраняем регистры - здесь передается число, которое нужно перевести в строку
xor esi, esi
mov eax, esi // копируем в регистр адрес
xor ecx, ecx // очищаем регистры
cmp eax, 0 // если нам пришел "0"
jne @@go_next // если не "0"
mov byte ptr [ebx], '0' // "0" заносим в массив число "0"
mov ecx, 1 // количество знаков
jmp @@loop_ret // хватит работать, на переворот символов
@@go_next:
mov edx, eax // копируем регистры
mov si, 000Ah // создаем делитель
and edx, 8000h // проверяем старший разряд
cmp edx, 8000h // если старший разряд
jne @@loop_10 // число позитивное
mov edx, eax // копируем число
add edx, 0FFFFh // прибавляем разрядность
not edx // инвертируем все биты
mov eax, edx // копируем результирующие число
xor edx, edx // очищаем регистр
mov byte ptr [ebx], '-' // ставим знак "-"
inc ebx // икрементируем следующие число
@@loop_10:
cmp eax, 0 // уже закончили ?
jz @@loop_ret // ДА! - пора домой ...
idiv esi // НЕТ! делим на систему исчисления
add ebx, ecx // следующий адрес (16bit)
add [ebx], edx // добавляем остаток от деления (16bit)
add byte ptr [ebx], '0' // добавляем символьный "0" (16bit)
sub ebx, ecx // предыдущий адрес (16bit)
xor edx, edx // очищаем остаток (иначе будет бред)
inc ecx // икрементируем количество цифр
jmp @@loop_10 // еще раз ...
@@loop_ret:
xor eax, eax // очищаем
mov al, byte ptr [ebx] // какой там символ в элементе строки ?
dec ecx // какой предыдущий адрес ?
add ebx, ecx // указываем новый адрес в строке
xchg [ebx], al // меняем первый и последний элемент местами
sub ebx, ecx // предыдущий адрес в сроке (16bit)
inc ecx // следующий адрес (16bit)
mov [ebx], al // копируем первый в последний
sub ecx, 2 // получаем адрес - 2 так лучше !
inc ebx // следующий элемент строки
cmp ecx, 0 // проверяем на конец строки
jg @@loop_ret // Не конец ? - тогда дальше ...
pop eax // Конец ! Возвращаем все регистры ...
pop edx // Конец ! Возвращаем все регистры ... - выходной аргумент
pop esi // Конец ! Возвращаем все регистры ... - выходной аргумент
ret // возврат из процедуры
mov Result, eax
end;
. . .
begin
s := MyStr(7);
messagebox(0,@s[1],'',0)
end;
end.