📄 4228.asm
字号:
div32s: ; 32位/32位带符号除法
clr r27 ;清除余数
clr r26
clr r25
clr r24
clr r30 ;清符号位
cpi r19,$7f ;判被除数的正负
brcc qubus1 ;为负,被除数取补
d32s_1:
cpi r23,$7f ;判除数的正负
brcc qubus2 ;为负,除数取补
d32s_2:
ldi r28,33 ;初始化循环计数器
d32s_3:
cp r24,r20 ;余数与除数相比较
cpc r25,r21
cpc r26,r22
cpc r27,r23
brcs d32s_4 ;进位位为 1,即后者大,跳至d32s_4
sub r24,r20 ;余数-除数
sbc r25,r21
sbc r26,r22
sbc r27,r23
sec ;置进位位
rjmp d32s_5
d32s_4:
clc ;清进位位
d32s_5:
rol r16 ;左移结果(被除数)
rol r17
rol r18
rol r19
rol r24 ;左移余数(被除数移到除数)
rol r25
rol r26
rol r27
dec r28 ; 计数器减 1
brne d32s_3 ;不为 0 ,跳至d32s_3
ror r27 ;右移余数
ror r26
ror r25
ror r24
cpi r30,$01 ;判符号位
breq qubus3 ;为 1 ,代表负,结果取补
d32s_6:
ret ;返回
qubus1:
inc r30 ;符号位加 1
com r16 ;取反加 1 (取补)
com r17
com r18
com r19
subi r16,$ff
sbci r17,$ff
sbci r18,$ff
sbci r19,$ff
rjmp d32s_1
qubus2:
inc r30 ;符号位加 1
com r20 ;取反加 1 (取补)
com r21
com r22
com r23
subi r20,$ff
sbci r21,$ff
sbci r22,$ff
sbci r23,$ff
rjmp d32s_2
qubus3:
com r16 ;取反加 1 (取补)
com r17
com r18
com r19
subi r16,$ff
sbci r17,$ff
sbci r18,$ff
sbci r19,$ff
rjmp d32s_6
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -