нужно uInt32.toString() на асме
Posted: 25 Dec 2011, 14:02
Есть сабж у кого может?
У нас - не говнофорум!
http://dlcorp.nedopc.com/
DimkaM wrote:Есть сабж у кого может?
lvd wrote:шо таково сложного поделить
fk0 wrote:printf
FromNet: NET_Moscow_Russia_(245_02/09/2005) (commserv.rpb.ru)
From: Kirill Frolov <fk0@fk0.pp.ru>
Hемедленно нажми на RESET, All!
В неоднократно публиковавшемся здесь алгоритме 32-битного деления
обнаружена серьёзная ошибка!
=== cut here ===
ifused ldiv
ifndef ldiv
; Беззнаковое 32-разрядное деление
; функция состоит из двух частей:
; 1. 32-разрядное делимое и 16-разрядный
; делитель.
; 2. 32-раздядное делимое и 32-разрядный
; делитель.
; hl'hl = hl'hl / de'de
; de'de = hl'hl % de'de
ldiv
push hl
xor a
ld l, a
ld h, a
sub e
ld e, a
sbc a, d
sub e
ld d, a
exx
=== cut here ===
Это начальные строки ОШИБОЧHОЙ ПРОГРАММЫ.
Для устранения ошибки их следует ЗАМЕHИТЬ на следующие:
ldiv
push hl
xor a
ld l, a
ld h, a
sub e
ld e, a
+ ld a, h ; a=0. -- эта строка добавлена
sbc a, d
ld d, a
exx
Ошибка была обнаружена lvd. Задаётся вопрос об авторстве:
автороство, по видимости, коллективное, по результатам переписки
в телеконференциях, иначе я обычно указываю откуда взято.
Полный текст функции выглядит следующим образом:
ifused ldiv
ifndef ldiv
; версия от 2006-12-18T15:11:28+0300
; Беззнаковое 32-разрядное деление
; функция состоит из двух частей:
; 1. 32-разрядное делимое и 16-разрядный
; делитель.
; 2. 32-раздядное делимое и 32-разрядный
; делитель.
; hl'hl = hl'hl / de'de
; de'de = hl'hl % de'de
ldiv
push hl
xor a
ld l, a
ld h, a
sub e
ld e, a
ld a, h
sbc a, d
ld d, a
exx
pop bc
ld a, 0
sbc a, e
ld e, a
sbc a, d ; de'de=0-divisor
sub e
ld d, a
and e
inc a ; Z=short divisor
push hl
ld hl, 0 ; hl'hl=reminder
exx
pop bc
ld a, b ; a,c,bc'=divident
jr nz, ldiv_long
; divisor = -00de
ld b, 8
rla
ldivs0
rl l
add hl, de
jr c, ldivs1
sbc hl, de
ldivs1 rla
djnz ldivs0
ld b, c
ld c, a
ld a, b
ld b, 8
rla
ldivs2
adc hl, hl
add hl, de
jr c, ldivs3
sbc hl, de
ldivs3 rla
djnz ldivs2
jr ldiv_long1
; divisor=-de'de
ldiv_long
call ldiv_8
ld b, c
ld c, a
ld a, b
call ldiv_8
ldiv_long1
exx
exa
ld a, b
exa
ld b, a
exa
exx
call ldiv_8
exx
exa
ld a, c
exa
ld c, a
exa
exx
call ldiv_8
; result=c,bc',a -> hl'hl
; reminder=hl'hl -> de'de
ex de, hl
ld l, a
ld a, c
exx
ex de, hl
ld h, a
ld l, b
ld a, c
exx
ld h, a
ret
; hl'hl=reminder
; de'de=divisor
; a=divident
ldiv_8
ld b, 8
rla
ldiv_8_0
adc hl, hl
exx
adc hl, hl
exx
add hl, de
exx
adc hl, de
exx
jr c, ldiv_8_1
sbc hl, de
exx
sbc hl, de
exx
ldiv_8_1
rla
djnz ldiv_8_0
ret
endif
endif
;(C) BUDDER/MGN/TOGYAF - 2011.12.26
;---------------------------------------
;ВЫВОД 32bit ЧИСЛА:
DECZON4 ;i:[DE,HL] - int32
; EXX DE - String addres
; o:Decimal string(10)
LD BC,#CA00,(CLHL),BC; 1B
LD BC,#3B9A,(CLDE),BC
CALL DELIT4T
EXX:LD (DE),A:INC DE:EXX
LD BC,#E100,(CLHL),BC; 100M
LD BC,#05F5,(CLDE),BC
CALL DELIT4T
EXX:LD (DE),A:INC DE:EXX
LD BC,#9680,(CLHL),BC; 10M
LD BC,#0098,(CLDE),BC
CALL DELIT4T
EXX:LD (DE),A:INC DE:EXX
LD BC,#4240,(CLHL),BC; 1M
LD BC,#000F,(CLDE),BC
CALL DELIT4T
EXX:LD (DE),A:INC DE:EXX
LD BC,#86A0,(CLHL),BC; 100K
LD BC,#0001,(CLDE),BC
CALL DELIT4T
EXX:LD (DE),A:INC DE:EXX
;-------
DECZON2 LD BC,10000,(CLHL),BC
LD BC,0,(CLDE),BC
CALL DELIT4T
PUSH HL
EXX:LD (DE),A:INC DE
POP HL
DECZ2 LD BC,1000
CALL DELIT
LD (DE),A:INC DE
DECZ1 LD BC,100
CALL DELIT
LD (DE),A:INC DE
DECZ LD C,10
CALL DELIT
LD (DE),A:INC DE
LD C,1
CALL DELIT
LD (DE),A:INC DE
RET
;---------------------------------------
DELIT LD A,#FF
OR A
DLIT INC A
SBC HL,BC:JP NC,DLIT
ADD HL,BC,A,#30
RET
;---------------------------------------
DELIT4T ;i:[DE,HL]/[CLDE,CLHL]
; o:[DE,HL] - Remainder
; BC - Count
LD IX,0-1
NAZE OR A
DLTB LD BC,0
INC IX
EX DE,HL:SBC HL,BC:JR C,ND
DLTA LD BC,0
EX DE,HL:SBC HL,BC:JR NC,DLTB
DEC DE
LD A,D:INC A:JR NZ,NAZE
LD A,E:INC A:JR NZ,NAZE
INC DE
ADD HL,BC
EX DE,HL
LD BC,(CLDE)
;-------
ND ADD HL,BC
EX DE,HL
Nd PUSH IX
POP BC
LD A,C:ADD A,#30
RET
;---------------------------------------
CLHL EQU DLTA+1
CLDE EQU DLTB+1
;---------------------------------------
У меня только под asm51. А вообще вон тебе сколько накидали.DimkaM wrote:Есть сабж у кого может?