void main(void)
{
printf("Hello world!")
}
Деление на i8051
Буду так же благодарен если найдётся алгоритм деления "столбиком" под это же.
P.S.: для земляков пиво :)
в случае деления на 0 все биты устанавливаем в 1, так называемая
бесконечность.
if (y <> 0)
{
z = 0;
i = 0;
while (x >= y)
{
y = y * 2;
i = i + 1;
}
while (i <> 0)
{
y = y / 2;
if (x >= y)
{
x = x - y;
cf = 1;
}
else
{
cf = 0;
}
z = z * 2 + cf;
i = i - 1;
}
}
else
{
z = max;
x = max;
}
y = x;
x = z;
......................................................................................................
x - r6r7; y - r4r5
......................................................................................................
$nolist
;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒;
CSEG
;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒;
div_word:
push b
mov b,r2
push b
mov b,r3
push b
;****************************************************************************;
;if (y <> 0) }
mov a,r4
orl a,r5
jz div_word_if1_else
;............................................................................;
;z = 0;
mov r2,#00h
mov r3,#00h
;i = 0;
mov b,#00h
;while (x >= y) {
div_word_while1:
clr c
mov a,r6
subb a,r4
mov a,r7
subb a,r5
jc div_word_while1_end
;y = y * 2;
mov a,r4
add a,r4
mov r4,a
mov a,r5
addc a,r5
mov r5,a
;i = i + 1;
inc b
;}
jmp div_word_while1
;..........................................................................;
div_word_while1_end:
;while (i <> 0) {
div_word_while2:
mov a,b
jz div_word_while2_end
;y = y / 2;
clr c
mov a,r5
rrc a
mov r5,a
mov a,r4
rrc a
mov r4,a
;if (x >= y) {
clr c
mov a,r6
subb a,r4
mov a,r7
subb a,r5
jc div_word_while2_if1_else
;x := x - y;
clr c
mov a,r6
subb a,r4
mov r6,a
mov a,r7
subb a,r5
mov r7,a
;cf = 1;
setb c
;}
jmp div_word_while2_if1_end
;else
div_word_while2_if1_else:
;cf := 0;
clr c
;........................................................................;
div_word_while2_if1_end:
;z := z * 2 + cf;
mov a,r2
addc a,r2
mov r2,a
mov a,r3
addc a,r3
mov r3,a
;i = i - 1;
dec b
;}
jmp div_word_while2
;..........................................................................;
div_word_while2_end:
;}
jmp div_word_if1_end
;else {
div_word_if1_else:
;z = max;
mov r2,#0FFh
mov r3,#0FFh
;x = max;
mov r6,#0FFh
mov r7,#0FFh
;............................................................................;
div_word_if1_end:
;y = x;
mov a,r6
mov r4,a
mov a,r7
mov r5,a
;x = z;
mov a,r2
mov r6,a
mov a,r3
mov r7,a
;****************************************************************************;
pop b
mov r3,b
pop b
mov r2,b
pop b
ret
;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒;
; КОНЕЦ ;
;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒;
$list
здесь 16 разрядное деление целых чисел, а впринципе можно хоть
256 бит определяется i.
с помощью команды div у меня неполучилось,
а так работает и неплохо.
Кстати алгоритм универсален можно делить хоть 24 бит на 8 бит и тд.
хм. текст фармотировал а отображается не форматировано.
при написании кода используй теги [ code ] [ /code ]. например:
Код:
ЗДЕСЬ я рассказывал как я когда-то делил на 580ВМ80 - может, пригодится :)
Но вот как к этому прикрутить DIV до сих пор не соображу.