Поиск:

Ответ в темуСоздание новой темы Создание опроса
> конвертация типов, создание процедуры преобразования 
:(
    Опции темы
cupoma58
  Дата 4.5.2018, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


ищущий



Профиль
Группа: Awaiting Authorisation
Сообщений: 31
Регистрация: 3.3.2017

Репутация: нет
Всего: нет



 Это - конвертация:
Код

asc2bin  proc                 ;выход: ЕBХ = дв.код
  push esi                    ;неявно используемый  
  xor  eax,eax
  xor  ebx,ebx
  lea  esi,ascbuf             ;указатель на ASCII-число
  mov  ecx,0Ah                ;ЕСХ = 10, основание системы счисления
  cycl:
    lodsb                     ;по-байтно из ESI в AL,сама обнуляет счётчик
    or   al,al                ;если в AL ничего не попало...
    jz   fin                  ;...закончили
    and  al,0Fh               ;очищаем старшую тетраду     <<< ???!!!
    imul ebx,ecx              ;(((0*10)+EAX)*10+EAX)*10+...
    add  ebx,eax              ;...
    cmp  ebx,limit            ;ebx > 4294967295
    ja   exit                 ;переполнение(CF=1 --> "clc" - сбросить флаг)
    jmp  cycl
    fin:
      pop  esi
    exit:
      ret
asc2bin  endp
bin2asc  proc  
  pushad                      ;так - проще
  mov  eax,result             ;дв.число-результат
  lea  edi,ascbuf             ;правый байт массива "ascbuf"? 
  xor  ecx,ecx                ;для учёта к-ва символов
  mov  ebx,0Ah                ;EBX <-- основание системы счисления
  conv:
    xor  edx,edx              ;убираем предыдущий символ
    div  ebx                  ;EAX/EBX, EAX=частное, EDX=остаток
    add  dl,30h               ;остаток (<10) --> ASCII-символ      
    push edx                  ;ASCII-символ --> стэк(для разворота)
    inc  ecx                  ;ЕСХ+1 <-- фиксируем символ, потребуется для "rev"
    test eax,eax              ;если в ЕАХ что-то осталось, то...
    jnz  conv                 ;...повторяем, если - нет, то...
  rev:                        ;...идём дальше
    pop  edx                  ;извлекаем символ 
    mov  [edi],dl             ;ASCII-символ --> "ascbuf"
    inc  edi                  ;смещаемся к месту следующего символа и...
    loop rev                  ;...повторяем, пока счётчик (ЕСХ) не обнулится
    mov  byte ptr [edi],0
    popad
    ret
bin2asc  endp

Она - работает, для целых и положительных чисел. Но сам арифмометр - со странностями: к итогу "сложение - вычитание" добавляется "0", а к итогу умножения - "00". Не могу понять - в чём дело. (арифмометр здесь: cupoma58.ru/assembler_04.html,data.html,const.html)


Это сообщение отредактировал(а) cupoma58 - 16.8.2018, 10:37
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для начинающих"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm для начинающих | Следующая тема »


 




[ Время генерации скрипта: 0.0897 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.