Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler: математика, вычисления
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
Alexus
0 / 0 / 0
Регистрация: 07.11.2014
Сообщений: 4
1

Перевод чисел из одной системы в другую

07.11.2014, 13:13. Просмотров 958. Ответов 3
Метки нет (Все метки)

Есть задание: создать программу переводящую число из одной системы счисления в другую. Исходное число задаётся в коде программы, как и основания систем счисления. Я написал код. Если смотреть по дебаггеру то он переводит числа так как надо, и должен вывести 10101101. А выводит почему то 111111. Подскажите пожалуйста, может я делаю что-то неправильно.

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
STACKSG  SEGMENT  PARA  STACK 'Stack'
         DW       32    DUP(?)
STACKSG  ENDS
;-------------------------------------
DATASG   SEGMENT  PARA  'Data'
CONST1   DB       'AD$';                     В конце числа должен стоять $
BASE1    DB       16d
CONST2   DB       '$$$$$$$$$',10,13
BASE2    DB       2d
NUM      DB       '?$', 10,13
STRLEN   DW       0
DATASG   ENDS;                                  ЗАВЕРШЕНИЕ СЕГМЕНТА ДАННЫХ
;-------------------------------------
CODESG   SEGMENT  PARA  'Code'
START    PROC     FAR;                                     
         ASSUME   CS:CODESG,DS:DATASG,SS:STACKSG,ES:DATASG;ОБЪЯВЛЯЕМ СЕГМЕНТЫ
         mov      ax, DATASG;                 установка в ds адреса
        mov      ds, ax;                      сегмента данных
         PUSH     DS;                         Отправляем в область стека DS
         SUB      AX, AX;                     Очищаем регистр АХ
         PUSH     AX;                         Отправляем в стек ноль
         MOV      CX,-1                       Для подсчёта цифр
         MOV      SI,0;                       Очищаем просто
;----------------------------Область подсчёта цифр в строке-----------------------------
@CALC:   MOV      AL, CONST1[SI];             Отправляем в АL число
         INC      SI;                         Переходим на другую цифру
         INC      CX;                         Повышаем счётчик цифр
         CMP      AL, 24h;                    Проверяем не $ ли это
         JNE      @CALC;                      Если не $ то возвращаемся на CALC
;-----------------------------Область перевода исходного числа из аски кода--------------
         MOV      SI, 0;                      Очищаем реестр SI
@L1:     MOV      BL, CONST1[SI];             Отправляем в BL код цифры
         SUB      BL, 30h;                    Переводим из кода в цифру
         CMP      BL, 11d;                    Проверка на введение поправки
         JAE      @MINUS;                     Прыжок на метку поправки
         JMP      @CON;                       Прыжок на con
@MINUS:  SUB      BL, 7;                      Вводим поправку для чисел > 9
@CON:    MOV      NUM[SI], BL;                Отправляем число по цифрам в NUM
         INC      SI;                         Инкремент счётчика
         LOOP     @L1;
;-----------------------------Область перевода полученного числа в десятичное--------------
         MOV      CX, SI;                     Отправляем в счётчик количество цифр
         PUSH     SI;                         Отправляем в стек это значение
         MOV      SI, 0;                      Очищаем реестр SI
         MOV      AH, BASE1;                  Заносим в АН основание первого числа(для MULT)
@LOG:    DEC      CX;                         Понижение счётчика
        PUSH     CX;                         Отправляем в стек значение счётчика
         MOV      AL, BASE1;                  В аккумулятор заносим основание 1
         MOV      BL, NUM[SI];                В базу заносим цифру исходного числа
         CMP      CX, 1;                      Сравниваем счётчик с единицей
         JE       @WK;                        Если единица, пропускаем пополнение аккумулятора
         CMP      CX, 0;                      Сравниваем счётчик с нулём
         JE       @DAL;                       Если ноль, то пропускаем произведение
@MULT:   MUL      AH;                         Накопление в аккумуляторе
         LOOP     @MULT;                      Цикл на накопление
         POP      CX;                         Достаём из цикла исходник CX
@WK:     MUL      BL;                         Перемножаем значение в AH с цифрой
@DAL:    INC      CX;                         Повышаем счётчик
         INC      SI;                         Переходим на другую цифру
         CMP      CX, 1;                      Сравниваем счётчик с единицей
         JNE      @HELL;                      Если равно, отправляем в MELL
         MOV      AL, 0;                      Если не равно очищаем AL
         ADD      DL, BL;                     Складываем сумму с цифрой (для последней цифры)
@MELL:   ADD      DL, AL;                     Складываем сумму с суммой (Не для последней цифры)
         LOOP     @LOG;                       Скачок в лог
;---------------------------Область перевода числа из десятичного в нужное-------------
         MOV      CONST2, DL;                 Записываем значение в десятичной форме
         MOV      AL, CONST2;                 Записываем в AL наше число в десятичной форме
@TRANS:  MOV      DX, 0;                      Чистим регистры
         MOV      AH, 0;                      ------||--------
         MOV      BX, 0;                      ------||--------
         MOV      CX, 0;                      ------||--------
         DIV      BASE2;                      Перевод в новую систему
         MOV      DL, AH;                     Записываем в регистр данных остаток
         INC      STRLEN
         PUSH     DX;                         Отправляем это значение в стек
         CMP      AL, 0;                      Сравниваем частное с нулём
         JNE      @TRANS;                     Если не ноль, повторяем деление
;---------------------------Перевод в числа в строку------------------------------------
         SUB      AX, AX;                     Чистим АХ
         SUB      SI, SI
         MOV      CX, STRLEN;                      В CX отправляем длину строки
@OUTP:   POP      DX;                         Достаём из стека остаток в DX
         CMP      DL, 10d;                    Сравниваем число с А
         JBE      @DES;                       Если число меньше 10, поправка не надо
         ADD      DL, 7h;                     Поправка для А-F
@DES:    ADD      DL, 30h;                    Переводим число из ASKII кода в цифру
         MOV      CONST2[SI], DL;              
         MOV      BH, CONST2[SI]
         INC      SI
         LOOP     @OUTP;                      Пока счётчик не сравнялся с нулём прыгаем на метку
;---------------------------Вывод на экран строки--------------------------------------------
         MOV             DX, offset CONST2
         MOV             AH, 9h
         INT             21h 
 
 
 
         mov             ax, 4C00h;           завершение программы
         int             21h;                 тип 21 прерывание
         ret
CODESG   ENDS
         END      START
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.11.2014, 13:13
Ответы с готовыми решениями:

Нужна помощь в решении задачи "Перевод числа из одной системы счисления в другую"
Доброго времени суток! Помогите пожалуйста не получается сделать задачу которая бы переводила числа...

перевод их одной с-мы счисления в другую
Здравствуйте. Подскажите пожалуйста, вот есть дробные числа десятичные, как их переводить из N-ной...

Перевод чисел в шестнадцатеричную и двоичную системы
Ребят, помогите, пожалуйста, написать программу: Есть числа, мы вводим данные они же в свою очередь...

Перевод чисел из одной системы счисления в другую
Программа работает для диапазона чисел в 1байт. Отрицательными числа берутся после 127d. проблемма...

Перевод чисел из одной системы счисления в другую
Здравствуйте, помогите осуществить калькулятор перевода чисел в разные СС. Максимальная длинна...

3
Mikl___
Автор FAQ
13486 / 6417 / 635
Регистрация: 11.11.2010
Сообщений: 11,588
07.11.2014, 13:50 2
Alexus,
внимательно прочитай закрепленную тему http://www.cyberforum.ru/assembler/thread54461.html
0
Alexus
0 / 0 / 0
Регистрация: 07.11.2014
Сообщений: 4
08.11.2014, 17:59  [ТС] 3
Mikl___,
что-то мне не очень помогла эта тема
0
Mikl___
Автор FAQ
13486 / 6417 / 635
Регистрация: 11.11.2010
Сообщений: 11,588
09.11.2014, 04:38 4
Alexus,
когда разберешься, можешь дополнить тему http://www.cyberforum.ru/assembler/thread54461.html разжевать, добавить свои примеры, а пока утверждение
Цитата Сообщение от Alexus Посмотреть сообщение
что-то мне не очень помогла эта тема
сильно смахивает на попытку заставить других пользователей писать ТВОЮ программу
0
09.11.2014, 04:38
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.11.2014, 04:38

Перевод чисел из одной системы счисления в другую
написать программу для перевода чисел (длиной 8 бит) из системы по основанию 10 в систему по...

Перевод чисел из одной системы в другую ТЕСТ
Всем привет мне задали сделать программу перевода в виде теста randomize; z:=random(100)+50;...

Перевод чисел из одной системы счисления в другую
Ребят, помогите пожалуйста выполнить контрольную работу. (задание и пример выполнения находятся в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru