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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.06.2015, 12:08   #1
GorinichYa
Новичок
Джуниор
 
Регистрация: 04.06.2015
Сообщений: 2
По умолчанию Программа для перевода чисел

Здравствуйте друзья
Помогите с программой
Нужно написать программу на языке ассемблер
Я должен буду ввести число в 2системе а программа должна перевести число в 16 систему
GorinichYa вне форума Ответить с цитированием
Старый 04.06.2015, 17:11   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

первое. определитесь, какой именно Ассемблер нужен. Они очень разные!
второе. с точки зрения программы, вводить в неё надо не число, в 2-й системе счисления, а СТРОКУ, представляющую собой запись числа в двоичной системе счисления.
третье. на форуме поиском можно найти
а) как ввести строку
б) как вывести числовое значение в 16-ном виде.

Вам останется дописать простенький цикл по переводу строки в целочисленное значение и собрать всё в единый код.
профит!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 04.06.2015, 21:44   #3
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

GorinichYa, а хде твой код?!
Для решения твой задачи, процедура преобразования заключается в следующем:

1. Отнимаеш от каждого/введённого символа 30h и сохраняеш все цифры в памяти.
2. Начиная с последнего байта, обрабатываеш массив справа-налево.
3. Умножаеш цифры на 1,2,4,8,16,32,64,128 и т.д., по-ходу складывая результаты.

Посмотри на пример ниже:
Код:
множитель:     128   64   32  16   8   4   2   1   
   массив:       1    1   0    1   1   0   1   1   
              -----------------------------------  
результат:     128 + 64 + 0 + 16 + 8 + 0 + 2 + 1 = 219d = DBh
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 05.06.2015, 01:17   #4
spolyr
Пользователь
 
Регистрация: 30.03.2015
Сообщений: 17
По умолчанию

ничего сложно, могу выкинуть исходник
двочн--десят--шестин
система, есть минусы, нули впереди не урезает до минимума, а так норм, будешь копать ?
spolyr вне форума Ответить с цитированием
Старый 05.06.2015, 06:14   #5
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Цитата:
Сообщение от spolyr Посмотреть сообщение
ничего сложно, могу выкинуть исходник
..вот как это выглядит на FASM'e (без обработки ошибок ввода):
Код:
use16
org 100h
jmp start

mess1   db  13,10,'Enter 8-digit BIN number: $'
mess2   db  13,10,'===================================='
        db  13,10,'HEX rezult..............: $'

start:
   mov  dx,mess1           ; запрос на ввод ----------------------------------------|
   mov  ah,9
   int  21h

   cld                     ; пишем слева-направо -----------------------------------|
   mov  cx,8               ; максимум 8 символов
inputs:
   xor  ax,ax              ; ждём символ с клавы
   int  16h
   int  29h                ; выводим символ на экран
   sub  al,30h             ; переводим символ в цифру
   stosb                   ; сохраняем число в ES:DI
   loop inputs             ; читаем следующий символ..

next:                      ; считали массив.. --------------------------------------|
   xor  dx,dx              ; здесь будет сумма
   mov  bl,1               ; начальное значение множителя
   mov  si,di              ; SI = длинна строки
   dec  si                 ; кастрируем её
   std                     ; читать справа-налево
sLoop:
   lodsb                   ; берём крайний-правый байт
   mul  bl                 ; умножаем число на множитель
   add  bl,bl              ; увеличиваем множитель на 2
   add  dl,al              ; суммируем элементы в DX
   loop sLoop

ends:                      ; все символы обработали.. ------------------------------|
   xor  ax,ax              ; AX = 0
   mov  al,dl              ; скопируем в AL результат
   push ax                 ; ..и сохраним его в стеке

   mov  dx,mess2           ; текстовая строка с результатом
   mov  ah,9
   int  21h

   pop  ax                 ; снимаем результат со-стека ----------------------------|
   mov  bx,16              ; фактор СС для вывода результата на экран
   call convert            ; зовём функцию перевода чисел
   mov  al,'h'             ; добавляем в конце букву 'h'
   int  29h

   xor  ax,ax              ; ждём нажатия клавиши.. --------------------------------|
   int  16h
   mov  ax,4c00h           ; и выходим из программы.
   int  21h

;--------------------------; функция перевода чисел в различные СС -----------------|
convert:
   xor  cx,cx
isDiv:
   xor  dx,dx
   div  bx
   push dx
   inc  cx
   or   ax,ax
   jnz  isDiv
isOut:
   pop  ax
   cmp  al,9
   jle  noHex
   add  al,7
noHex:
   add  al,30h
   int  29h
   loop isOut
ret  ;---------------------; выход из функции --------------------------------------|
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 05.06.2015, 08:52   #6
spolyr
Пользователь
 
Регистрация: 30.03.2015
Сообщений: 17
По умолчанию

R71MT
а где настройка DI перед циклом в начале ?
spolyr вне форума Ответить с цитированием
Старый 05.06.2015, 09:11   #7
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

..зачем? SI и DI и так по-нулям при загрузке, а с каждым "стосбом" DI увеливается на 1.
Как цикл закончится - DI хранит длинну строки +1, при чтении из памяти просто передаём это значение в SI. Как-то так...
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 05.06.2015, 10:19   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

R71MT, кстати, у этой задачи есть и более короткое решение.
не обязательно переводить строку в число.
можно воспользоваться свойством, что все системы счисления, которые представляют собой одно и то же число в разных степенях (в данном случае это число 2, двоичная - это 2 в первой, шестнадцатеричная - это 2 в четвертой), поэтому можно брать строку, представляющую двоичное число, отсчитывать по четыре символа и менять на один символ, представляющий одну шестнадцатеричную цифру. Преимущество - можно переводить числа практически НЕОГРАНИЧЕННОЙ значности (ну, например, 100-значное двоичное число )
Serge_Bliznykov вне форума Ответить с цитированием
Старый 05.06.2015, 10:57   #9
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

..точно! Говорят-же: век-живи, век-учись..
Спасибо, учту эту особенность...
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 05.06.2015, 20:45   #10
vadimych
Форумчанин
 
Регистрация: 16.01.2011
Сообщений: 325
По умолчанию

Цитата:
Сообщение от R71MT
SI и DI и так по-нулям при загрузке
Откуда сведения? В отладчике увидели? Напишите программу, которая выведет значения регистров при старте, и убедитесь в том, что ни SI ни DI не равны нулю. Во-вторых, если даже DI равен нулю, не стоит в качестве буфера использовать PSP.
vadimych вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программа перевода арабских чисел в римские с++ Дана188 Помощь студентам 1 19.03.2015 10:28
Программа перевода чисел. super3994 C# (си шарп) 6 20.04.2012 19:13
Программа перевода чисел super3994 Фриланс 2 20.04.2012 17:47
Программа перевода чисел с плавающей запятой Veselyn Помощь студентам 4 03.01.2010 19:49
паскаль,программа для перевода чисел из 10-ой системы счисления в другую до10-ой Nikitaunett Помощь студентам 4 28.11.2009 20:06