Гиперболический косинус
Добавлено: 17 дек 2007, 23:32
Буду очень-очень благодарен за полный код!
Кто шарит помогите плиз, а то на днях сдавать.
Кто шарит помогите плиз, а то на днях сдавать.
Числовой сопроцессор сократит объем кода, время разработки и сложность программы в несколько раз. Без него считать експоненту будет гораздо сложнее" писал(а):3. не знаю что это такое , лишних замутов не надо
Асм и Си - два разных языка, ассемблер по уровню находится ниже Си, посему программы писать на нем сложнее и дольше - но и скорость работы гораздо выше" писал(а):вооще у меня задание - сделать прогу совместно с сишником, но я так понимаю это не меняет код программы на асме?
Код: Выделить всё
.model tiny
.code
.386
jmp @start
Invitation db 'Input X = $'
Input db 8,0, 9 dup (0)
Ten dd 10.0
Value dq ?
Result db 13,10,13,10,'Cosh(x) = '
ResultValue db 25 dup(0)
;=============================================
; Input : DS:SI - Offset to string
; Output : ST(0) - Number
; No error checking to safe code
; Negative numbers supported
; "+" sign not supported
;
StrToFloat proc near
pusha
push es
movzx cx, [si+1]
inc cx
add si, 2
mov di, si
mov ax, ds
mov es, ax
cld
mov bx, cx
mov al, '.'
repnz scasb
sub bx, cx
sub bx, 2
dec di
movzx cx, [si-1]
fld1
sub dh, dh
cmp [si], byte ptr '-'
jnz @stf_positive
mov dh, 1
dec cx
dec bx
inc si
@stf_positive:
or bx, bx
jz @stf_floatpart
fmul Ten
dec bx
jmp @stf_positive
@stf_floatpart:
fstp @STF_Multiplier
fldz
@stf_loop:
cmp si, di
jz @stf_point
movzx ax, byte ptr [si]
sub al, 30h
mov @stf_digit, ax
fild @stf_digit
fmul @STF_Multiplier
fadd
fld @STF_Multiplier
fdiv Ten
fstp @STF_Multiplier
@stf_point:
inc si
dec cx
jnz @stf_loop
cmp dh, 1
jnz @stf_exit
fchs
@stf_exit:
pop es
popa
ret
@STF_Multiplier dd ?
@STF_Digit dw ?
StrToFloat endp
;=================================================
; Input: Number must be in St(0)
; DI - Offset to string
; DL - Digits in float number
; String will be terminated by '$'
;
FloatToStr proc near
pushad
movzx bp, dl
add bp, di
fnstcw @fts_cw
fwait
or @fts_cw, 0f00h
fldcw @fts_cw
fldz
fcomp
fstsw ax
test ax, 100h
jnz @fts_positive
fchs
mov [di], byte ptr '-'
inc di
@fts_positive:
fist @FTS_IntegerPart
mov eax, @FTS_IntegerPart
mov ebx, 10
sub ch, ch
@fts_int1:
sub edx, edx
div ebx
push dx
inc ch
or eax, eax
jnz @fts_int1
@fts_int2:
pop ax
add al, 30h
mov [di], al
inc di
dec ch
jnz @fts_int2
fisub @FTS_IntegerPart
mov [di], byte ptr '.'
inc di
@fts_loop:
cmp bp, di
jz @fts_exit
fmul Ten
fist word ptr @FTS_IntegerPart
fisub word ptr @FTS_IntegerPart
mov al, byte ptr @FTS_IntegerPart
add al, 30h
mov [di], al
inc di
jmp @fts_loop
@fts_exit:
mov [di], byte ptr '$'
fstp st(0)
popad
ret
@fts_IntegerPart dd ?
@fts_cw dw ?
FloatToStr endp
;=================================================
; Calculates E^x
; Input : st(0) = x
; Output: st(0) = e^x
;
Exp proc near
fldl2e ; y := x*log2e
fmul
fld st(0) ; i := round(y)
frndint
fsub st(1), st ; f := y - i
fxch st(1) ; z := 2**f
f2xm1
fld1
fadd
fscale ; z * 2**i
fstp st(1)
ret
Exp endp
;=================================================
@start:
push cs
pop ds
mov ax, 3
int 10h
mov ah, 9
mov dx, offset Invitation
int 21h
mov ah, 0Ah
mov dx, offset Input
int 21h
mov si, dx
call StrToFloat
fst Value ; cosh(x) = (e^x + e^(-x)) / 2
call Exp ; e^x
fld Value
fchs
call Exp ; e^-x
fadd
fld1
fld1
fadd ; st(0) = 2
fdiv
mov di, offset ResultValue
mov dl, 25
call FloatToStr
mov dx, offset Result
mov ah, 9
int 21h
mov ax, 4C00h
int 21h
end