관리 메뉴

너와 나의 스토리

어셈블리 - FPU 예제 (실습 코드) 본문

Programming Language/Assembly

어셈블리 - FPU 예제 (실습 코드)

노는게제일좋아! 2019. 6. 7. 23:38
반응형

1) 사용자에게 원의 반경을 묻고 원의 면적을 계산하고 화면에 표시하라

call readfloat		 ; 사용자 입력 받아서 ST(0)에 넣음
fmul st(0),st(0)	  ; st(0)=st(0)*st(0)
fldpi			  ; st(0)=pi, st(1)=사용자 입력값^2
fmul			   ; st(1)=st(1)*st(0), st(0) pop
call writefloat

 

2)  ax^2+bx+c=0  에서 다항식 근 구하기 (사용자로부터 a,b,c 값 받아서 구하기)

할 일:

1. a,b,c 사용자 입력 받기

2. B^2-4AC 구하기

3. 첫 번째 근 (-B+root(B^2-4AC))/2A 구하기

4. 두 번째 근 (-B-oot(B^2-4AC))/2A 구하기

 

include irvine32.inc

.data
coeffA real8 ?
coeffB real8 ?
coeffC real8 ?
two real8 2.0
four real8 4.0
zero real8 0.0
part1 real8 ?
junk real8 2.0
str1 byte "해당 근은 허수이다.",0
str2 byte "첫번째 근: ",0
str3 byte "두번째 근: ",0
.code
main proc
	; 사용자 입력 받기
	call readfloat
	fst coeffA
	call readfloat
	fst coeffB
	call readfloat
	fst coeffC
	; st(0)=c, st(1)=b, st(2)=a

	finit ; FPU stack 초기화

	; B^2-4AC 연산
	fld coeffB
	fmul st(0),st(0)	; st(0)=b^2

	fld four
	fmul coeffA
	fmul coeffC			; st(0)=4AC, st(1)=b^2

	fsub				; st(0) = B^2-4AC
	
	; 허수 판별
	fld zero			; st(0)=0 ,st(1)= B^2-4AC
	fcomi st(0),st(1)
	ja imaginary_root	; 0이 B^2-4AC보다 크다면 jump
	fstp junk			; junk =0
	fsqrt				 ; square root
	fst part1			; root(B^2-4AC)
	
	; 첫 번째 근 계산
	fld coeffB
	fchs  ; st(0)=-B
	fadd part1  ; -B+root(B^2-4AC)
	fld coeffA
	fmul two     ; st(0)=2A
	fdivp st(1),st(0)  ; part1/2A

	mov edx,offset str2
	call writestring
	call writefloat
	call crlf

	; 두 번째 근 구하기
	fld coeffB
	fchs 
	fsub part1  ; -B-root(B^2-4AC)
	fld two
	fmul coeffA  ; 2A
	fdivp

	mov edx,offset str3
	call writestring
	call writefloat
	call crlf

	jmp normal_finish


imaginary_root:
	mov edx,offset str1
	call writestring


normal_finish:
	
	exit
main endp
end main
반응형
Comments