pokk
Помогающий
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
|
|
« Ответ #1 : 13-05-2011 12:14 » |
|
покажи на примере И... двоично-десятичный код разным бывает
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
pokk
Помогающий
Offline
|
|
« Ответ #2 : 13-05-2011 12:26 » |
|
Дано число 123 в двоично-десятичном коде будет 0001(цифра 1) 0010(цифра 2) 0011(цифра 3) 123=0001 0010 0011
|
|
|
Записан
|
|
|
|
Sla
|
|
« Ответ #3 : 13-05-2011 12:36 » |
|
Дано число 123 в двоично-десятичном коде будет 0001(цифра 1) 0010(цифра 2) 0011(цифра 3) 123=0001 0010 0011
на 1, 2 3 и я могу а вот покажи на 8 и на 9 и со знаком
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #4 : 13-05-2011 12:41 » |
|
Не, всё долблюсь. Двоично-десятичные. Стоит же в условии.
Слав, ну будет тогда так:
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
|
|
« Ответ #5 : 13-05-2011 13:21 » |
|
Джон, не надо этого делать
8421BCD 2421BCD
Хочу со знаком!!!
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
pokk
Помогающий
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
|
|
« Ответ #7 : 13-05-2011 13:46 » |
|
что-то я не понимаю вас откуда у вас буквы взялись ?
есть, как минимум, два способа кодирования двоично-десятичных чисел BCD 8-4-2-1 привычная . т.е. указаны вес разрядов BCD 2-4-2-1 менее привычная, но тем не менее имеющая право на жизнь 2421 это тоже вес разрядов исправленно.... потому что видов преобразования больше чем два
|
|
« Последнее редактирование: 13-05-2011 13:57 от Sla »
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
pokk
Помогающий
Offline
|
|
« Ответ #8 : 13-05-2011 13:55 » |
|
ааа в Упакованный BCD-код перевожу =) (BCD 8-4-2-1)
|
|
|
Записан
|
|
|
|
Sla
|
|
« Ответ #9 : 13-05-2011 13:56 » |
|
а вопрос по существу... приведенный код работает?
Если работает, и ты считаешь свой алгоритм верным - отлично.
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
pokk
Помогающий
Offline
|
|
« Ответ #10 : 13-05-2011 14:17 » |
|
работал =)) но вот щас заметил что большие цифры не хочет делить выдаёт ошибку деление на 0 нашёл из за чего это происходит при делении чисел больше 2559 к примеру 2561 в регистр ah частное 256 не помешается как можно устранить это ?
у меня вот какой вопрос был если у меня в массиве будет число -1111011 оно запишется в регистр ах как 0000101 так вот как мне с этим быть ?
|
|
« Последнее редактирование: 13-05-2011 14:30 от pokk »
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #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
Помогающий
Offline
|
|
« Ответ #12 : 15-05-2011 02:35 » |
|
Подскажите как сделать так что если при делении числа остаток не помешается в регистр ah он просто не учитывается т.е как сделать деление без остатка ?
|
|
|
Записан
|
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #13 : 15-05-2011 04:47 » |
|
pokk, а где он "учитывается"?
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
pokk
Помогающий
Offline
|
|
« Ответ #14 : 15-05-2011 04:52 » |
|
Ну мне надо что бы его просто не было пусть 0 там будут или другие любые цифры главное что бы не выскакивала ошибка деления на 0 а она как я понял появляется из за того что остаток не помешается в ah
|
|
« Последнее редактирование: 15-05-2011 05:00 от pokk »
|
Записан
|
|
|
|
Sla
|
|
« Ответ #15 : 15-05-2011 07:12 » |
|
Скажи, а зачем ты делишь на 10, зачем тебе остаток Расскажи алгоритм.
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
pokk
Помогающий
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
Технический
Администратор
Offline
Пол:
|
|
« Ответ #17 : 15-05-2011 11:29 » |
|
Просто загрузи целое в стек FPU и сохрани как BCD.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #18 : 15-05-2011 12:07 » |
|
pokk, а почему делишь на 8-ибитный регистр BL, а не на 16-битный BX? При делении на операнд размером WORD, частное помещается в AX, а остаток в DX. Аналогично с EAX, EDX, если операнд размером DWORD.
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
Sla
|
|
« Ответ #19 : 15-05-2011 16:15 » |
|
это легче показать на примере есть число 5678 делим его на 10 получаем 567,8 остаток записываем в массив далее обнуляем остаток и делим частное на 10 получается 56,7 остаток записываем опять в массив и так далее пока частное не будет =0 получается в массиве будет записываться 0008 0007 0006 0005
А теперь покажи этот код у себя
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
pokk
Помогающий
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 »
|
Записан
|
|
|
|
|