Цель работы
Изучение способов представления и
алгоритмов преобразования числовых данных.
Лабораторное задание
Разработать программу перевода целого знакового числа из
одной системы счисления в другую: из троичной в двоичную.
Число в 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
Комментариев нет:
Отправить комментарий