Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.12.2010, 19:41   #1
jungle
Пользователь
 
Аватар для jungle
 
Регистрация: 22.11.2008
Сообщений: 65
Стрелка Преобразование типов

Посмотрите, пожалуйста. Где ошибка?

Код:
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.
jungle вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Преобразование типов ArtGoN Visual C++ 7 04.12.2010 22:00
Преобразование типов rommster Общие вопросы C/C++ 6 23.11.2010 08:11
Преобразование типов ArtGoN Общие вопросы C/C++ 5 16.11.2010 19:35
Преобразование типов Aleksandra1990 Общие вопросы C/C++ 5 12.05.2010 17:32
Преобразование типов Pronik Общие вопросы Delphi 2 12.06.2007 12:23