Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: преобразования двухбайтового числа в двоично-десятичное  (Прочитано 28218 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
pokk
Помогающий

ru
Offline Offline

« : 13-05-2011 11:41 » 

Здравствуйте  у меня снова  появились вопросы  задание следующее.
"Написать программу преобразования двухбайтового  числа в двоично-десятичное число с учетом знака."
написал программку которая преобразует но  без учёта  знака  вот  теперь у меня загвоздка  как сделать с учётом знака.

Есть не большое соображение  в самом начале программы сделать определение какой знак у числа  если +  то пойти по алгоритму 1  если минус то  преобразовать из дополнительного кода в обычный  и  сделать тоже самое что и в первом(>0) случае  но вот  как указать знак в конце выполнения программы ?

но как-то это сильно сложно  полагаю есть более простое решение

model   small
.data
V1      dw   10011010010
V2      db   1 DUP(?)
.code
      mov   ax,@data                     
      mov   ds,ax                        
      mov Si,50         ;индекс(начальный адрес)
      mov   ax,V1         ;записываем число в регистр из массива
        mov   bl,1010b      ;делитель
next:                  ;метка перехода
      div bl            ;делим число  ah=остаток, al=частное 
      mov   V2[SI],ah      ;остаток записываем в массив V2
      dec SI            ;отнимаем 1 от индекса
      mov ah,0h         ;очищаем остаток
      cmp al,0         ;сравниваем   частное с 0  если не равно 0 то переходим на метку next   
      jne next
      
      mov   ax,4c00h
      int   21h
      end
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 13-05-2011 12:14 » 

покажи на примере
И... двоично-десятичный код разным бывает
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
pokk
Помогающий

ru
Offline Offline

« Ответ #2 : 13-05-2011 12:26 » 

Дано число  123  в двоично-десятичном коде  будет  0001(цифра 1)  0010(цифра 2)  0011(цифра 3)  
123=0001 0010 0011

Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 13-05-2011 12:36 » 

Дано число  123  в двоично-десятичном коде  будет  0001(цифра 1)  0010(цифра 2)  0011(цифра 3) 
123=0001 0010 0011


на 1, 2 3 и я могу

а вот покажи на 8 и на 9 и со знаком
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #4 : 13-05-2011 12:41 » new

Не, всё долблюсь. Двоично-десятичные. Стоит же в условии.

Слав, ну будет тогда так:

1000 1000 1001
« Последнее редактирование: 13-05-2011 12:45 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 13-05-2011 13:21 » 

Джон, не надо этого делать

8421BCD
2421BCD

Хочу со знаком!!!
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
pokk
Помогающий

ru
Offline Offline

« Ответ #6 : 13-05-2011 13:31 » 

Цитата
8421BCD
2421BCD

Хочу со знаком!!!

что-то я  не понимаю вас   откуда у вас буквы взялись ?

вот со знаком вот что нашёл  "Обычно для кодирования знака плюс применяют код 1100 (С), а для знака минус - 1101 (D)"

число  +3495  будет 1100 0011 0100 1001 0101
для      -3495  ->        1101 0011 0100 1001 0101
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 13-05-2011 13:46 » 

Цитата
что-то я  не понимаю вас   откуда у вас буквы взялись ?
есть, как минимум, два способа кодирования двоично-десятичных чисел

BCD 8-4-2-1 привычная . т.е. указаны вес разрядов
BCD 2-4-2-1 менее привычная, но тем не менее имеющая право на жизнь 2421 это тоже вес разрядов


исправленно.... потому что видов преобразования больше чем два
« Последнее редактирование: 13-05-2011 13:57 от Sla » Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
pokk
Помогающий

ru
Offline Offline

« Ответ #8 : 13-05-2011 13:55 » 

 Улыбаюсь ааа  в  Упакованный BCD-код  перевожу  =) (BCD 8-4-2-1)
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #9 : 13-05-2011 13:56 » 

а вопрос по существу...
приведенный код работает?

Если работает, и ты считаешь свой алгоритм верным - отлично.
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
pokk
Помогающий

ru
Offline Offline

« Ответ #10 : 13-05-2011 14:17 » 

работал   =)) но вот щас заметил что большие цифры не хочет делить   выдаёт ошибку  деление на 0
нашёл из за чего  это происходит  при делении чисел больше 2559   к примеру  2561  в регистр ah  частное  256 не помешается
как можно устранить это ?

у меня вот какой вопрос  был  если у меня в массиве будет число  -1111011   оно запишется в регистр  ах как 0000101  так вот как мне с этим быть ?

« Последнее редактирование: 13-05-2011 14:30 от pokk » Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #11 : 13-05-2011 15:31 » 

Насчет "обычно" не соглашусь. Ни разу такого "обычно" не встречал. Зато встречал просто знаковый бит.

Вот пример BCB формата FPU: всего 80 бит, старший (79-й) - знак, биты 72..78 - не используются (0), биты 0..71 хранят 18 BCD знаков:
s000 0000 dddd dddd ... dddd dddd

Альтернативно, для более компактного хранения, можно сжать до формата:
s000 dddd dddd dddd ... dddd dddd

Если длина BCD-строки переменная, я бы использовал первый байт для хранения знака и количества цифр:
snnn nnnn dddd dddd ... dddd dddd

С этими форматами все просто:
объединяем знаковые биты операндов по XOR: результат равен "1" - использует вычитание, в противном случае - сложение;
объединяем знаковые биты операндов по AND: результат равен "1" - инвертируем знаковый бит результата.
« Последнее редактирование: 13-05-2011 15:33 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
pokk
Помогающий

ru
Offline Offline

« Ответ #12 : 15-05-2011 02:35 » 

Подскажите как сделать так что если при делении  числа  остаток не помешается в регистр  ah  он просто не учитывается 
т.е как сделать  деление без остатка  ?
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #13 : 15-05-2011 04:47 » 

pokk, а где он "учитывается"?
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
pokk
Помогающий

ru
Offline Offline

« Ответ #14 : 15-05-2011 04:52 » 

Ну мне надо что бы его просто не было  пусть 0  там будут или другие любые цифры   Улыбаюсь главное что бы не выскакивала  ошибка деления на 0  а она как я понял появляется из за того что остаток не помешается в  ah
« Последнее редактирование: 15-05-2011 05:00 от pokk » Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #15 : 15-05-2011 07:12 » 

Скажи, а зачем ты делишь на 10, зачем тебе остаток
Расскажи алгоритм.
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
pokk
Помогающий

ru
Offline Offline

« Ответ #16 : 15-05-2011 11:03 » 

Код:
Скажи, а зачем ты делишь на 10, зачем тебе остаток
Расскажи алгоритм.

это легче показать на примере  есть число  5678  делим его на  10  получаем  567,8   остаток записываем в массив   далее  обнуляем остаток и делим частное на 10   получается  56,7  остаток записываем опять в  массив    и так далее пока частное не будет =0  получается  в массиве будет  записываться  0008 0007 0006 0005

Но при таком  алгоритме  возникает проблема  если число будет  больше  2559  к примеру  2600   то при делении  на 10  частное будет равно  260  а такое число не помешается а регистр   ah(суда можно поместить 8бит =255)

вот по этому пришла другая идея  делить на переменный  делитель  возьмём тоже число  5678  поделим изначально на  1000   
5678/1000=5,678   частное запишем в массив  далее   выполним операцию  исходное число(5678)-частное*делитель=678
после  делим  сам делитель на 10    и далее получаем  678/10=6.78  опять записываем частное в массив и это всё в цикле организовать по тому же условию  (пока частное не будет равно нулю)

Но  тут у меня опять возникла  проблема при делении  того же числа  5678 на 1000 получаем  5.678  остаток сильно большой и тоже не помешается в регистр aL  вот по этому я и спрашивал как  поделить число  без остатка
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #17 : 15-05-2011 11:29 » 

Просто загрузи целое в стек FPU и сохрани как BCD.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #18 : 15-05-2011 12:07 » 

pokk, а почему делишь на 8-ибитный регистр BL, а не на 16-битный BX? При делении на операнд размером WORD, частное помещается в AX, а остаток в DX. Аналогично с EAX, EDX, если операнд размером DWORD.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #19 : 15-05-2011 16:15 » 

Цитата
это легче показать на примере  есть число  5678  делим его на  10  получаем  567,8   остаток записываем в массив   далее  обнуляем остаток и делим частное на 10   получается  56,7  остаток записываем опять в  массив    и так далее пока частное не будет =0  получается  в массиве будет  записываться  0008 0007 0006 0005
А теперь покажи этот код у себя
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
pokk
Помогающий

ru
Offline Offline

« Ответ #20 : 16-05-2011 11:33 » 

Цитата
При делении на операнд размером WORD, частное помещается в AX, а остаток в DX. Аналогично с EAX, EDX, если операнд размером DWORD.

аааааааа  спасибо большое     Класс! Класс! Класс!

Добавлено через 2 часа, 38 минут и 18 секунд:
Всем спасибо за помощь
получилось   такое

Код:
model	small
.data
V1 dw 1234h
V2 dw 1 DUP(?)
.code
mov ax,@data
mov ds,ax
mov Si,50 ;индекс(начальный адрес)
mov ax,V1 ;записываем число в регистр из массива
        mov bx,1010b ;делитель (10)
mov dx,0000h
add ax,0000h ;опереляем знак
js minus ;переход  если  ax<0 то перейти на метку minus
plus: ;метка перехода
div bx ;делим число  dx=остаток, aч=частное 
mov V2[SI],Dx ;остаток записываем в массив V2
dec SI ;отнимаем 1 от индекса
dec SI
mov Dx,0000h ;очищаем остаток
mov v2[SI],1100b ; означает знак плюс(C) после перезаписи становится в старшей тетраде
cmp ax,0 ;сравниваем частное с 0  если не равно 0 то переходим на метку next
jne plus
jmp ennd ;безусловный переход на завершение программы
minus:
not ax ; инвертирование числа
minusfor:
div bx ;делим число  dx=остаток, ax=частное 
mov V2[SI],Dx ;остаток записываем в массив V2
dec SI ;отнимаем 1 от индекса
dec SI
mov Dx,0000h ;очищаем остаток
mov v2[SI],1101b ;означает знак минус(D) после перезаписи становится в старшей тетраде
cmp ax,0 ;сравниваем частное с 0  если не равно 0 то переходим на метку next
jne minusfor
ennd:
mov ax,4c00h
int 21h
end
« Последнее редактирование: 16-05-2011 14:12 от pokk » Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines