Page 1 of 7

нужно uInt32.toString() на асме

PostPosted: 25 Dec 2011, 14:02
by DimkaM
Есть сабж у кого может?

Re: нужно uInt32.toString() на асме

PostPosted: 25 Dec 2011, 14:24
by deathsoft
DimkaM wrote:Есть сабж у кого может?

У савелия наверняка есть, фатал то числа печатает.

Re: нужно uInt32.toString() на асме

PostPosted: 25 Dec 2011, 14:26
by lvd
А шо таково сложного поделить на 10 с остатком? Ну до, 32 бита, а и чо?

Re: нужно uInt32.toString() на асме

PostPosted: 25 Dec 2011, 16:03
by DimkaM
lvd wrote:шо таково сложного поделить

Ща другим занят, хотел паралельно халяву поиметь, чтоб потом время на велосипед не терять.

Re: нужно uInt32.toString() на асме

PostPosted: 25 Dec 2011, 19:19
by fk0
Бля, printf. За асм -- сжигать.

Re: нужно uInt32.toString() на асме

PostPosted: 25 Dec 2011, 20:07
by DimkaM
fk0 wrote:printf

дохера места сжирает, ежли с иара выдёргивать.

Re: нужно uInt32.toString() на асме

PostPosted: 25 Dec 2011, 22:06
by TS-Labs
фк0: объясни чем плохи асмовые вставки на сях? Я например чотко вижу что придется пилить множество риалтаймовых процедур на асме. Я не понимаю что в этом плохого?

Re: нужно uInt32.toString() на асме

PostPosted: 25 Dec 2011, 23:02
by lvd
Вот процедура деления:
Code: Select all
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

Re: нужно uInt32.toString() на асме

PostPosted: 26 Dec 2011, 00:03
by Budder
набросал тут побыстрому процедурко:

инпут:
.DE, HL - 32бит число (DE старшая часть)
.DE ' - адрес строки в которую покладём резалт (10 байт)

Code: Select all
;(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
;---------------------------------------

Re: нужно uInt32.toString() на асме

PostPosted: 26 Dec 2011, 03:13
by jdigreze
DimkaM wrote:Есть сабж у кого может?
У меня только под asm51. А вообще вон тебе сколько накидали. ;)