Деление вычитанием на At89c51 в среде keil uvision
Деление вычитанием на At89c51 в среде keil uvision
Люди добрые, может ли кто то помочь с данной проблемой:
Нужно разделить 32бит(регистры R4R3R2R1-слева старший) на 16 бит(R6R5-слева старший)
препод сказал делать деление вычитанием(но если кто-то поможет сделать и не вычитанием, было бы замечательно, препод бы оценил)
вот, что получается у меня(так сказал препод):
Vichitanie:
mov R0,#4
metka5:
mov A,R1
subb A,R5
mov R1,A
mov A,R2
subb A,R6
mov R2,A
mov A,R3
subb A,#0
mov R3,A
mov A,R4
subb A,#0
mov R4,A
Jc konec
mov A,R7
Add A,#1
mov R7, A
mov A, R7
Addc a,#0
mov R7,A
djnz R0,metka5
konec:
ret
end
Исправьте, пожалуйста ошибку, подозреваю, что она где то после Jc konec, ибо в регистр R7 нужно было, как я понял записать результат вычитания, но как сделать, если он больше 8 бит.
Заранее премного благодарен.
Нужно разделить 32бит(регистры R4R3R2R1-слева старший) на 16 бит(R6R5-слева старший)
препод сказал делать деление вычитанием(но если кто-то поможет сделать и не вычитанием, было бы замечательно, препод бы оценил)
вот, что получается у меня(так сказал препод):
Vichitanie:
mov R0,#4
metka5:
mov A,R1
subb A,R5
mov R1,A
mov A,R2
subb A,R6
mov R2,A
mov A,R3
subb A,#0
mov R3,A
mov A,R4
subb A,#0
mov R4,A
Jc konec
mov A,R7
Add A,#1
mov R7, A
mov A, R7
Addc a,#0
mov R7,A
djnz R0,metka5
konec:
ret
end
Исправьте, пожалуйста ошибку, подозреваю, что она где то после Jc konec, ибо в регистр R7 нужно было, как я понял записать результат вычитания, но как сделать, если он больше 8 бит.
Заранее премного благодарен.
Последний раз редактировалось yeti2332 Сб апр 26, 2014 19:16:59, всего редактировалось 1 раз.
- Реклама
- pyzhman
- Друг Кота
- Сообщения: 7016
- Зарегистрирован: Вс июл 12, 2009 19:15:29
- Откуда: Ижевск
- Контактная информация:
Re: Деление вычитанием на At89c51 в среде keil uvision
Код: Выделить всё
mov A,R1
subb A,R5Docendo discimus
Re: Деление вычитанием на At89c51 в среде keil uvision
Прошу прощения, опечатался, R1R2R3R4-справа старший, ну или R4R3R2R1, аналогично и с R5R6
Последний раз редактировалось yeti2332 Сб апр 26, 2014 19:22:26, всего редактировалось 1 раз.
Re: Деление вычитанием на At89c51 в среде keil uvision
поправил условие
Re: Деление вычитанием на At89c51 в среде keil uvision
1. Сразу после метки 5 добавьте команду "clr C"
2. Результат деления 32-битного числа на 16-битное в общем случае также 32-битный. Поэтому для его хранения нужно 4 регистра (или 4 байта в памяти). Если хотите использовать регистры, переключитесь перед добавлением 1 к результату деления в другой банк регистров манипуляцией битами в PSW. В конце этого процесса не забудьте переключится назад в прежний банк.
2. Результат деления 32-битного числа на 16-битное в общем случае также 32-битный. Поэтому для его хранения нужно 4 регистра (или 4 байта в памяти). Если хотите использовать регистры, переключитесь перед добавлением 1 к результату деления в другой банк регистров манипуляцией битами в PSW. В конце этого процесса не забудьте переключится назад в прежний банк.
- Реклама
-
pcb
- Опытный кот
- Сообщения: 833
- Зарегистрирован: Пт авг 12, 2011 09:14:27
- Откуда: Млечный путь/Земля/РФ/Екатеринбург
Re: Деление вычитанием на At89c51 в среде keil uvision
Фрунзе А. Трехтомник. деление умножение сложение вычитание. Всё есть 
Разработал:
-BLDC
-ФУОЗ/МПСЗ
-SMART BMS
-ECU/EDC на STM32F4(43%)+CPLD(57%)
-Моноинжектор на ATSAMD20G16
-контроллер эффектов для RGB LED ленты
-умные часы/обратный счет/секундомер
-устройство измерения емкости АКБ
-BLDC
-ФУОЗ/МПСЗ
-SMART BMS
-ECU/EDC на STM32F4(43%)+CPLD(57%)
-Моноинжектор на ATSAMD20G16
-контроллер эффектов для RGB LED ленты
-умные часы/обратный счет/секундомер
-устройство измерения емкости АКБ
Re: Деление вычитанием на At89c51 в среде keil uvision
Программа не работает, поэтому и прошу помощи, кто-то может конкретно написать, что не правильно в программе(поставил clr с в начале)? И что должно быть в регистре R7 результат какой? младший, старший, средний?
- ua1arn
- Встал на лапы
- Сообщения: 81
- Зарегистрирован: Вт май 08, 2012 23:15:45
- Откуда: Санкт - Петербург
Re: Деление вычитанием на At89c51 в среде keil uvision
Попробуйте перевести в нужные Вам мнемоники эту функцию деления - в 80-х годах подсмотрено в журнале Электроникс - для процессора 8080, с тех пор перенесено под все нужные мне процссоры:
Код: Выделить всё
;
; de = hlde / bc
; hl = hlde % bc
DIV: ld a,l
sub c
ld a,h
sbc a,b
ret nc ; overflow
xor a
DIV0: add hl,hl ; shift << (31..16)
push af ; save count and cy
ex de,hl
add hl,hl ; shift << (15..0)
ex de,hl
jp nc,DIV1
inc hl
DIV1 EQU $
;
ld a,l ; hl = hl - bc;
sub c
ld l,a
ld a,h
sbc a,b
ld h,a
jp c,DIV3 ; delitelx > delimoe
pop af ; restore count and cy
DIV2: inc de ; one bit to result.
jp DIV4
;
DIV3: pop af
jp c,DIV2 ; set one bit to result.
add hl,bc ; restore - hl = hl + bc
DIV4: add a,10H
jp nc,DIV0 ; repeat 16
RET
Re: Деление вычитанием на At89c51 в среде keil uvision
ребят, кто-то шарит этом или нет? говорю изучаю ассемблер 2 дня, мне предлагают перевести незнакомый код, еще из 80-х.(я благодарен за помощь, но мне нужно подразжевать)
Re: Деление вычитанием на At89c51 в среде keil uvision
clr в начале цикла нужно для обнуления заема при вычитании младших байтов чисел.
то в R7 будет младший байт реяультата. Вы почему-то проигнорировали мой второй совет из поста выше. Там и описано решение. Одного 8-битного регистра R7 не хватит для представления 32-битного результата - нужно 4 регистра. Но т.к. в программе уже заняты 6 регистров из 8-ми в данном банке, следует либо переключиться на другой банк регистров, либо использовать память. Если не поминаете о чем я здесь пишу, прочитайте в любой книге по архитектуре М51 что такое банки регистров и как их переключать.
В данной программе белиберда. Но если манипуляции с R7 в программе свести кyeti2332 писал(а):И что должно быть в регистре R7...?
Код: Выделить всё
mov A,R7
Add A,#1
mov R7, A- ua1arn
- Встал на лапы
- Сообщения: 81
- Зарегистрирован: Вт май 08, 2012 23:15:45
- Откуда: Санкт - Петербург
Re: Деление вычитанием на At89c51 в среде keil uvision
При "делении с восстановлением остатка" результат образуется в тех же регистрах, где было делимое.разделить 32бит(регистры R4R3R2R1-слева старший) на 16 бит(R6R5-слева старший)
Дополнительно нужен только один регистр - для счетчика на 16 и рабочий регистр А для выполнения многобайтной арифметики.
Яндекс в помощь с гуглём, хотя работающего исходника на незнакомом процессоре вполне хватит для разбирательств с алгоритмом.
Re: Деление вычитанием на At89c51 в среде keil uvision
Вообще-то, при классической реализации деления чисел путем вычитания делителя из делимого и последующего сдвига, как с восстановлением остатка так и без него, в регистрах делимого остается не частное а остаток от деления. Частное при этом накапливается на стороне в дополнительных регистрах, см. например
http://www.gaskley.narod.ru/Discr/Discr_Math_22.html
Конечно, можно попробовать сохранять биты частного на месте использованных на предыдущих итерациях битов делимого. При такой реализации потребуется еще где-то помнить в какой бит и в какой байт делимого поместить бит частного после каждой итерации. Но если Вам, ua1arn, изветна более простая реализация 32:16-бит деления с получением частного в битах делимого и использованием только одного дополнительного регистра для счетчика (и еще А), как Вы указали, просьба сообщить.
http://www.gaskley.narod.ru/Discr/Discr_Math_22.html
Конечно, можно попробовать сохранять биты частного на месте использованных на предыдущих итерациях битов делимого. При такой реализации потребуется еще где-то помнить в какой бит и в какой байт делимого поместить бит частного после каждой итерации. Но если Вам, ua1arn, изветна более простая реализация 32:16-бит деления с получением частного в битах делимого и использованием только одного дополнительного регистра для счетчика (и еще А), как Вы указали, просьба сообщить.
- ua1arn
- Встал на лапы
- Сообщения: 81
- Зарегистрирован: Вт май 08, 2012 23:15:45
- Откуда: Санкт - Петербург
Re: Деление вычитанием на At89c51 в среде keil uvision
Так этот алгоритм в ассемблере z80 и приведён выше.При такой реализации потребуется еще где-то помнить в какой бит и в какой байт делимого поместить бит частного после каждой итерации. Но если Вам, ua1arn, изветна более простая реализация 32:16-бит деления с получением частного в битах делимого и использованием только одного дополнительного регистра для счетчика (и еще А), как Вы указали, просьба сообщить.
Алгоритм, переделанный для чисел любой длины на массивах - в аттачменте.
Re: Деление вычитанием на At89c51 в среде keil uvision
Вышеприведенный алгоритм на ассемблере работает корректно только если частное не превосходит 16 бит. В противном случае оно просто не поместится в регистровую пару de и в ней будут только младшие 2 байта результата (с остатком в hl все нормально). К тому-же помимо регистров алгоритм на каждой итерации использует память (стек).
А код из аттачмента на C/C++ и не ясно использует-ли он после компиляции какие-либо дополнительные ресурсы на уровне команд процессора (например, память и сколькоее) а не только регистры для организации деления.
А код из аттачмента на C/C++ и не ясно использует-ли он после компиляции какие-либо дополнительные ресурсы на уровне команд процессора (например, память и сколькоее) а не только регистры для организации деления.


