Лабораторная работа по ассемблеру системы счисления

Цель работы

Изучение способов представления и алгоритмов преобразования числовых данных.

Лабораторное задание

Разработать программу перевода целого знакового числа из одной системы счисления в другую: из троичной в двоичную.

Число в ASCII разместить следующим способом:
Чем старше разряд, тем младше адрес (ЗнЦЦЦ…Ц).


Листинг
asm4.cpp
#include <stdio.h>
#include <conio.h>

void error(){
      printf("error digit");
}

void main()
{
      char a[]="2011";
      char sist;
      int num, b;
      char res[20];

      _asm
      {
            mov sist,3; //Заносим в переменную sist основание исходной системы счисления

            lea esi,a;

            mov ecx,[esi]
            mov eax,0;
            mov ebx,0;
            mov ecx,0;
            mov cl,sist;

            cmp [esi],'-';
            jne todigit;
            add esi,1; //Если первый элемент строки - минус, пропускам этот элемент

todigit: //Перевод строки в число (число формируется в регистре AX)
            imul cx; //Умножение полученного на предыдущем этапе числа на основание системы счисления
            mov bl,[esi];
            cmp bl,0;
            je endtodigit;
            sub bl,'0'; //Перевод очередного символа в цифру
            cmp bl,sist;
            jge err;
            mov [esi],bl;
            add ax,bx; //Добавление очередной полученной цифры к числу
            mov num,eax;
            add esi,1;
            jmp todigit;
endtodigit:

            mov cx,1;
            mov b,0;

tobinary: //Перевод 10-тичного числа в 2-ичное
            mov eax,num;
            mov ebx,eax;
            cdq;
            mov si,2;
            idiv si;
            imul ecx,10;
            mov num,eax;
            imul edx,ecx;
            add b, edx;
            cmp num,2;
            jge tobinary;

            mov eax,0;
            mov eax,b;
            cdq;
            mov ebx,10;
            idiv ebx;
            mov ebx,num;
            imul ebx,ecx;
            add eax,ebx;
            mov num,eax;

            lea edi,res;
            mov ecx,0;

            lea esi,a;
            cmp [esi],'-';
            jne tostr;
            mov [edi],'-'; //Если в изначальной строке первый символ был '-', записываем его первым символом в строку-результат
            add edi,1;

tostr: //Переводим число в строку
            mov eax,num;
            mov ebx,eax;
            mov b,10;
            cdq;
            idiv b;
            mov num,eax;
            mov bl,dl;
            add bl,'0'; //Получаем очередной символ цифры, начиная с конца строки
            push bl; //Вталкиваем ее с стек
            add ecx,1; //Добавляем 1 к счетчику
            cmp eax,0;
            jne tostr;

for_str: //Выталкиваем символы из стека
            pop eax;
            mov [edi],al;
            add edi,1;
            loop for_str;

            mov [edi],0;
            jmp end;

err:
            call error;

end:
      }

     
            printf("%s",res);
     


getch();


Результат работы программы
Расчёт вручную:
2  1  0
1023=1*32+0*31+2*30=9+2=1110

Комментариев нет:

Отправить комментарий