![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
БНТУ ФИТР
Форумчанин
Регистрация: 20.05.2012
Сообщений: 315
|
![]()
Здравствуйте. Преподаватель поставил задачу разделить число на само себя(12h/12h в моём варианте). Нельзя использовать команду DIV, а можно только команду сдвига SRH, команду and для проверки чётности и команду sub. Уже неделю ломаю мозг, всё никак. Из того,что придумал:
mov ax,12h shr ax,1 12h/2=9 shr ax,1; 9h/2=4 -----> CF=1 shr ax,1 4/2=2 shr ax,1 2/2=1 Четырьмя последовательными сдвигами я достиг результата 1. Число 2 в 4-ой степени = 10h. Преподаватель говорит, что я разделил 12h/10h , а мне нужно 12 на 12. т.е (2^4+2); Помогите плз, кто знает чем.
С++(console/builder/WinAPI/Linux), C#, Pascal, Delphi, Asm, Prolog.
< ----- Контакты kventin_zhuk@live.com Последний раз редактировалось kventin_zhuk; 20.05.2012 в 02:55. Причина: описка |
![]() |
![]() |
![]() |
#2 | |
Форумчанин
Регистрация: 16.01.2011
Сообщений: 325
|
![]() Цитата:
|
|
![]() |
![]() |
![]() |
#3 |
C/C++, Asm
Участник клуба
Регистрация: 02.03.2010
Сообщений: 1,323
|
![]()
вопрос не в результате, а в упражнении.
не знаю зачем свиг и "и". все что приходит на ум, это вычитать 12h пока вычитается и инкрементить счетчик вычитаний. |
![]() |
![]() |
![]() |
#4 | ||
БНТУ ФИТР
Форумчанин
Регистрация: 20.05.2012
Сообщений: 315
|
![]() Цитата:
Цитата:
С++(console/builder/WinAPI/Linux), C#, Pascal, Delphi, Asm, Prolog.
< ----- Контакты kventin_zhuk@live.com |
||
![]() |
![]() |
![]() |
#5 |
Старожил
Регистрация: 08.02.2012
Сообщений: 2,173
|
![]()
и какой результат хочет увидеть ваш преподаватель? целое число с остатком или дробное число?
Правильно поставленная задача - три четверти решения.
|
![]() |
![]() |
![]() |
#6 |
Участник клуба
Регистрация: 11.01.2010
Сообщений: 1,139
|
![]()
kventin_zhuk
ниже несколько способов деления без использования команд div/idiv Табличное преобразование Для реализации деления на заранее известное число можно использовать табличное преобразование (команда XLAT). Деление через вычитание Частное от деления можно представить как количество вычитаний делителя из делимого до тех пор, пока делимое сохраняет знак. Это дало возможность организовать деление путем повторения последовательности вычитаний с проверкой знака делимого. Если произошла перемена знака, то нужно уменьшить счетчик числа вычитаний на единицу, а делимое и делитель сложить. Теперь делимое будет равно остатку, а счетчик числа вычитаний равен частному. Так делили на ранних микропроцессорах Intel (i4004, i8080), которые еще не поддерживали команду деления. Деление через вычитание, сложение и сдвиги При делении двоичных чисел используют два алгоритма: алгоритм деления без восстановления и алгоритм деления с восстановлением. При делении с помощью вычитаний, сложений и сдвигов можно использовать две схемы. Схема а – делимое по мере вычисления сдвигается влево, делитель остается неподвижным. Схема б – делимое неподвижно, а делитель по мере вычисления сдвигается вправо. Цифры частного формируются по значению бита переноса CF, устанавливаемого при вычитании или сложении делителя и делимого, и сдвигаются влево. Таким образом, можно использовать четыре способа деления через вычитания, сложения и сдвиги. Показываю алгоритм деления без восстановления на примере 125/11=11 остаток 4. Из делимого вычитается делитель, умноженный на степень двойки. Произведение числа на 2^n эквивалентно сдвигу этого числа на n разрядов влево. Если знак результата положительный, то нужно прибавить 2^n к частному, если знак результата отрицательный – частное не увеличивается. Когда знак результата меняется на отрицательный, вычитание заменяется сложением. Так повторяется при уменьшающихся степенях двойки до тех пор, пока не будет достигнута степень, равная нулю. Остатком считается последний положительный результат. Делим 125 на 11. Делитель укладывается в байт (11<255), поэтому начинаем с 2^7. В начале вычисления частное всегда равно 0: 125 – 11 × 2^7= –1283 –1283 +11 × 2^6= –579 –579 +11 × 2^5= –227 –227 +11 × 2^4= –51 –51 + 11 × 2^3= 37 результат положительный, поэтому складываем 2^3 с частным, частное равно 8+0=8 37 – 11 × 2^2= – 7 –7 + 11 × 2^1= 15 результат положительный, поэтому складываем 2^1 с частным, частное равно 8+2=10 15 –11 × 2^0 = 4 результат положительный, поэтому складываем 2^0 с частным, частное равно 10+1=11, остаток равен 4 Код:
|
![]() |
![]() |
![]() |
#7 |
Форумчанин
Регистрация: 23.02.2010
Сообщений: 107
|
![]()
18 = 10010 = 2^4 + 2^1
A*18 = A*(2^4 + 2^1) = A*2^4 + A*2^1 A/18 = A*(1/18) 1/18 = 2^(-5) + 2^(-6) + 2^(-7) (о представлении дробных чисел в двоичной системе см. вики) A*(1/18) = A*2^(-5) + A*2^(-6) + A*2^(-7) A*(1/18) = 0 - A*2^(-5) - A*2^(-6) - A*2^(-7) Только это работает как-то неправильно: 18/18 даст 0(т.к. 18>>5 = 0, 18>>6 = 0, 18>>7 = 0.) Последний раз редактировалось Indian; 22.05.2012 в 21:25. |
![]() |
![]() |
![]() |
#8 |
БНТУ ФИТР
Форумчанин
Регистрация: 20.05.2012
Сообщений: 315
|
![]()
Всем спасибо, разобрался)
С++(console/builder/WinAPI/Linux), C#, Pascal, Delphi, Asm, Prolog.
< ----- Контакты kventin_zhuk@live.com |
![]() |
![]() |
![]() |
#9 |
Участник клуба
Регистрация: 11.01.2010
Сообщений: 1,139
|
![]()
Indian
A*(1/18)~A*2^(-4)-A*2^(-7)+A*2^(-10)=A/17,964912280701754385964912280702 при А=18 даст 1 Последний раз редактировалось Mikl___; 29.05.2012 в 06:43. |
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Деление в C++ | Юнона | Общие вопросы C/C++ | 10 | 29.05.2011 17:53 |
Деление массива на число, и последующий Division by zero [Assembler] | HostileZeth | Помощь студентам | 1 | 14.12.2010 19:14 |
Деление | 0479 | Общие вопросы по Java, Java SE, Kotlin | 1 | 08.11.2010 00:37 |
Деление в С++ | Tanilita | Общие вопросы C/C++ | 5 | 26.02.2010 17:28 |
Деление | |{ot | Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM | 4 | 24.03.2009 01:50 |