Files
HCMUT/KTMT/Others/BaiTapCaNhan.asm
2018-11-11 19:33:20 +07:00

192 lines
4.3 KiB
NASM

#Chuong trinh tinh dien tich tu giac
#Input: Toa do 4 diem A, B, C, D
#Output: Dien tich tu giac ABCD (neu A, B, C, D tao thanh tu giac don)
# Hoac bao loi ABCD khong phai la tu giac don (theo dinh nghia cua Wikipedia)
#Han che: Khong xu ly duoc truong hop tran so
# Khong tinh toan chinh xac tuyet doi dien tich cua tu giac
#Khai bao bien
.data
xA: .float 0
yA: .float 0
xB: .float 0
yB: .float 0
xC: .float 0
yC: .float 0
xD: .float 0
yD: .float 0
zero: .float 0
half: .float 0.5
one: .float 1
#Cau nhac lenh
inXA: .asciiz "Nhap toa do xA:\n"
inYA: .asciiz "Nhap toa do yA:\n"
inXB: .asciiz "Nhap toa do xB:\n"
inYB: .asciiz "Nhap toa do yB:\n"
inXC: .asciiz "Nhap toa do xC:\n"
inYC: .asciiz "Nhap toa do yC:\n"
inXD: .asciiz "Nhap toa do xD:\n"
inYD: .asciiz "Nhap toa do yD:\n"
outS: .asciiz "Dien tich tu giac ABCD la:\n"
err: .asciiz "Loi: ABCD khong tao thanh tu giac don!\n"
#Code
.text
.globl main
main:
#Nhap du lieu
la $a0, inXA
li $v0, 4
syscall
li $v0, 6
syscall
swc1 $f0, xA
mov.s $f1, $f0
la $a0, inYA
li $v0, 4
syscall
li $v0, 6
syscall
swc1 $f0, yA
mov.s $f3, $f0
la $a0, inXB
li $v0, 4
syscall
li $v0, 6
syscall
swc1 $f0, xB
mov.s $f3, $f0
la $a0, inYB
li $v0, 4
syscall
li $v0, 6
syscall
swc1 $f0, yB
mov.s $f4, $f0
la $a0, inXC
li $v0, 4
syscall
li $v0, 6
syscall
swc1 $f0, xC
la $a0, inYC
li $v0, 4
syscall
li $v0, 6
syscall
swc1 $f0, yC
la $a0, inXD
li $v0, 4
syscall
li $v0, 6
syscall
swc1 $f0, xD
la $a0, inYD
li $v0, 4
syscall
li $v0, 6
syscall
swc1 $f0, yD
#Xu ly
l.s $f0, zero
#Doc toa do A, B, C, D vao $f1 den $f8
lwc1 $f1, xA
lwc1 $f2, yA
lwc1 $f3, xB
lwc1 $f4, yB
lwc1 $f5, xC
lwc1 $f6, yC
lwc1 $f7, xD
lwc1 $f8, yD
#Kiem tra B va D co nam 2 phia duong thang AC khong
#Tinh gia tri a, b, c trong phuong trinh duong thang AC: ax + by + c = 0
#Gan gia tri vao $f29, $f30, $f31
sub.s $f29, $f2, $f6 #a = yA - yC
sub.s $f30, $f5, $f1 #b = xC - xA
#Neu a = b = 0 thi bao loi do A trung voi C
c.eq.s 0, $f29, $f0
bc1f 0, next1
c.eq.s 1, $f30, $f0
bc1f 1, next2
j error
#Neu a != 0 thi rut gon b = b/a, a = 1
#Neu khong thi b = 1
next1:
div.s $f30, $f30, $f29
lwc1 $f29, one
j ok
next2:
lwc1 $f30, one
ok: mul.s $f27, $f29, $f1 #$f27 = xA*a
mul.s $f28, $f30, $f2 #$f28 = yA*b
add.s $f31, $f27, $f28 #$f31 = xA*a + yA*b
neg.s $f31, $f31 #$f31 = -(xA*a + yA*b)
#Tinh a*xB + b*yB + c gan vao $f28
mov.s $f28, $f31 #$f28 = c
mul.s $f27, $f29, $f3 #$f27 = a*xB
add.s $f28, $f28, $f27 #$f28 = a*xB + c
mul.s $f27, $f30, $f4 #$f27 = b*yB
add.s $f28, $f28, $f27 #$f28 = a*xB + b*yB + c
#Bao loi neu $f28 = 0 do B thuoc duong thang AC
c.eq.s $f28, $f0
bc1t error
#Tinh a*xD + b*yD + c gan vao $f27
mov.s $f27, $f31 #$f27 = c
mul.s $f26, $f29, $f7 #$f26 = a*xD
add.s $f27, $f27, $f26 #$f27 = a*xD + c
mul.s $f26, $f30, $f8 #$f26 = b*yD
add.s $f27, $f27, $f26 #$f27 = a*xD + b*yD + c
#Bao loi neu $f27 = 0 do D thuoc duong thang AC
c.eq.s $f27, $f0
bc1t error
#Tinh $f26 = $f27 * $f28
mul.s $f26, $f27, $f28
#Neu $f26 > 0 thi bao loi do B, D cung phia voi duong thang AC
c.le.s $f26, $f0
bc1f error
#Tinh dien tich 2 tam giac ABC va ACD
#Tinh do dai doan thang AC va luu vao $f26
sub.s $f24, $f1, $f5 #$f24 = xA - xC
mul.s $f24, $f24, $f24 #$f24 = (xA - xC)^2
sub.s $f25, $f2, $f6 #$f25 = yA - yC
mul.s $f25, $f25, $f25 #$f25 = (yA - yC)^2
add.s $f26, $f24, $f25 #$f26 = (xA - xC)^2 + (yA - yC)^2
sqrt.s $f26, $f26 #$f26 = AC
#Tinh sqrt(a*a + b*b) va luu vao thanh ghi $f25
mul.s $f23, $f29, $f29 #$f23 = a^2
mul.s $f24, $f30, $f30 #$f24 = b^2
add.s $f25, $f24, $f23 #$f25 = a^2 + b^2
sqrt.s $f25, $f25 #$f25 = sqrt(a^2 + b^2)
#Tinh khoang cach tu B den AC (hB), luu vao $f24
mov.s $f24, $f28
abs.s $f24, $f24
div.s $f24, $f24, $f25
#Tinh khoang cach tu D den AC (hD), luu vao $f23
mov.s $f23, $f27
abs.s $f23, $f23
div.s $f23, $f23, $f25
#Tinh Sabc, luu vao $f22
lwc1 $f22, half #$f22 = 0.5
mul.s $f22, $f22, $f24
mul.s $f22, $f22, $f26
#Tinh Sacd, luu vao $f21
lwc1 $f21, half #$f21 = 0.5
mul.s $f21, $f21, $f23
mul.s $f21, $f21, $f26
#Tinh Sabcd = Sabc + Sacd, luu vao $f20
add.s $f20, $f21, $f22
#Xuat ket qua
la $a0, outS
li $v0, 4
syscall
mov.s $f12, $f20
li $v0, 2
syscall
#Thoat chuong trinh
exit:
li $v0, 10
syscall
#Xu ly ngoai le
error:
la $a0, err
li $v0, 4
syscall
j exit