어셈블리 언어(MIPS)로 두 점 거리 계산하기
정수 버전
영수를 버리다.
소스 코드
# データセクション
.data
# 文字列の定義
input_message_0: .asciiz "x0: "
input_message_1: .asciiz "y0: "
input_message_2: .asciiz "x1: "
input_message_3: .asciiz "y1: "
output_message: .asciiz "Distance: "
eol: .asciiz "\n"
# テキストセクション
.text
# main()
# 「入力」→「計算」→「出力」を繰り返す
main:
# x0の要求と代入
li $v0, 4
la $a0, input_message_0
syscall
li $v0, 5
syscall
move $s0, $v0
# y0の要求と代入
li $v0, 4
la $a0, input_message_1
syscall
li $v0, 5
syscall
move $s1, $v0
# x1の要求と代入
li $v0, 4
la $a0, input_message_2
syscall
li $v0, 5
syscall
move $s2, $v0
# y1の要求と代入
li $v0, 4
la $a0, input_message_3
syscall
li $v0, 5
syscall
move $s3, $v0
# 2点間の距離を計算
sub $t0, $s0, $s2
sub $t1, $s1, $s3
mul $t0, $t0, $t0
mul $t1, $t1, $t1
add $a0, $t0, $t1
jal sqrt
move $t0, $v0
# 答えを表示
li $v0, 4
la $a0, output_message
syscall
li $v0, 1
move $a0, $t0
syscall
li $v0, 4
la $a0, eol
syscall
syscall
# リトライ
j main
# sqrt()
# $a0: in
# $v0: out
sqrt:
# r = 0;
move $v0, $zero
# while (1) {
sqrt_loop_start:
# a = r * r;
mul $t0, $v0, $v0
# if (a > x) break;
bgt $t0, $a0, sqrt_loop_end
# r = r + 1;
addi $v0, $v0, 1
# }
j sqrt_loop_start
sqrt_loop_end:
# r = r - 1;
addi $v0, $v0, -1
# return r;
jr $ra
실행 예
단일 정밀도 부동 소수점 버전
수렴할 때까지 계산하다.
소스 코드
# データセクション
.data
# 文字列の定義
input_message_0: .asciiz "x0: "
input_message_1: .asciiz "y0: "
input_message_2: .asciiz "x1: "
input_message_3: .asciiz "y1: "
output_message: .asciiz "Distance: "
eol: .asciiz "\n"
# 浮動小数点数即値の定義
floats: .float 0.0, 1.0, 2.0
# テキストセクション
.text
# main()
# 「入力」→「計算」→「出力」を繰り返す
main:
# x0の要求と代入
li $v0, 4
la $a0, input_message_0
syscall
li $v0, 6
syscall
mov.s $f20, $f0
# y0の要求と代入
li $v0, 4
la $a0, input_message_1
syscall
li $v0, 6
syscall
mov.s $f21, $f0
# x1の要求と代入
li $v0, 4
la $a0, input_message_2
syscall
li $v0, 6
syscall
mov.s $f22, $f0
# y1の要求と代入
li $v0, 4
la $a0, input_message_3
syscall
li $v0, 6
syscall
mov.s $f23, $f0
# 0.0, 1.0, 2.0の代入
la $t0, floats
l.s $f24, 0($t0)
l.s $f25, 4($t0)
l.s $f26, 8($t0)
# 2点間の距離を計算
sub.s $f4, $f20, $f22
sub.s $f5, $f21, $f23
mul.s $f4, $f4, $f4
mul.s $f5, $f5, $f5
add.s $f12, $f4, $f5
jal sqrt
# 答えを表示
li $v0, 4
la $a0, output_message
syscall
li $v0, 2
mov.s $f12, $f0
syscall
li $v0, 4
la $a0, eol
syscall
syscall
# リトライ
j main
# sqrt()
# $f12: in
# $f0: out
sqrt:
# if (x <= 0.0) goto sqrt_zero;
c.le.s $f12, $f24
bc1t sqrt_zero
# a = 1.0;
mov.s $f4, $f25
# while (1) {
sqrt_loop_start:
# b = a
mov.s $f5, $f4
# a = (x / a + a) / 2
div.s $f6, $f12, $f4
add.s $f6, $f6, $f4
div.s $f4, $f6, $f26
# if (a == b) break;
c.eq.s $f4, $f5
bc1t sqrt_loop_end
# }
j sqrt_loop_start
sqrt_loop_end:
# return a;
mov.s $f0, $f4
jr $ra
# return 0.0;
sqrt_zero:
mov.s $f0, $f24
jr $ra
실행 예
Reference
이 문제에 관하여(어셈블리 언어(MIPS)로 두 점 거리 계산하기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/mpyw/items/e2ab8b5ece17d257032d
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
# データセクション
.data
# 文字列の定義
input_message_0: .asciiz "x0: "
input_message_1: .asciiz "y0: "
input_message_2: .asciiz "x1: "
input_message_3: .asciiz "y1: "
output_message: .asciiz "Distance: "
eol: .asciiz "\n"
# テキストセクション
.text
# main()
# 「入力」→「計算」→「出力」を繰り返す
main:
# x0の要求と代入
li $v0, 4
la $a0, input_message_0
syscall
li $v0, 5
syscall
move $s0, $v0
# y0の要求と代入
li $v0, 4
la $a0, input_message_1
syscall
li $v0, 5
syscall
move $s1, $v0
# x1の要求と代入
li $v0, 4
la $a0, input_message_2
syscall
li $v0, 5
syscall
move $s2, $v0
# y1の要求と代入
li $v0, 4
la $a0, input_message_3
syscall
li $v0, 5
syscall
move $s3, $v0
# 2点間の距離を計算
sub $t0, $s0, $s2
sub $t1, $s1, $s3
mul $t0, $t0, $t0
mul $t1, $t1, $t1
add $a0, $t0, $t1
jal sqrt
move $t0, $v0
# 答えを表示
li $v0, 4
la $a0, output_message
syscall
li $v0, 1
move $a0, $t0
syscall
li $v0, 4
la $a0, eol
syscall
syscall
# リトライ
j main
# sqrt()
# $a0: in
# $v0: out
sqrt:
# r = 0;
move $v0, $zero
# while (1) {
sqrt_loop_start:
# a = r * r;
mul $t0, $v0, $v0
# if (a > x) break;
bgt $t0, $a0, sqrt_loop_end
# r = r + 1;
addi $v0, $v0, 1
# }
j sqrt_loop_start
sqrt_loop_end:
# r = r - 1;
addi $v0, $v0, -1
# return r;
jr $ra
수렴할 때까지 계산하다.
소스 코드
# データセクション
.data
# 文字列の定義
input_message_0: .asciiz "x0: "
input_message_1: .asciiz "y0: "
input_message_2: .asciiz "x1: "
input_message_3: .asciiz "y1: "
output_message: .asciiz "Distance: "
eol: .asciiz "\n"
# 浮動小数点数即値の定義
floats: .float 0.0, 1.0, 2.0
# テキストセクション
.text
# main()
# 「入力」→「計算」→「出力」を繰り返す
main:
# x0の要求と代入
li $v0, 4
la $a0, input_message_0
syscall
li $v0, 6
syscall
mov.s $f20, $f0
# y0の要求と代入
li $v0, 4
la $a0, input_message_1
syscall
li $v0, 6
syscall
mov.s $f21, $f0
# x1の要求と代入
li $v0, 4
la $a0, input_message_2
syscall
li $v0, 6
syscall
mov.s $f22, $f0
# y1の要求と代入
li $v0, 4
la $a0, input_message_3
syscall
li $v0, 6
syscall
mov.s $f23, $f0
# 0.0, 1.0, 2.0の代入
la $t0, floats
l.s $f24, 0($t0)
l.s $f25, 4($t0)
l.s $f26, 8($t0)
# 2点間の距離を計算
sub.s $f4, $f20, $f22
sub.s $f5, $f21, $f23
mul.s $f4, $f4, $f4
mul.s $f5, $f5, $f5
add.s $f12, $f4, $f5
jal sqrt
# 答えを表示
li $v0, 4
la $a0, output_message
syscall
li $v0, 2
mov.s $f12, $f0
syscall
li $v0, 4
la $a0, eol
syscall
syscall
# リトライ
j main
# sqrt()
# $f12: in
# $f0: out
sqrt:
# if (x <= 0.0) goto sqrt_zero;
c.le.s $f12, $f24
bc1t sqrt_zero
# a = 1.0;
mov.s $f4, $f25
# while (1) {
sqrt_loop_start:
# b = a
mov.s $f5, $f4
# a = (x / a + a) / 2
div.s $f6, $f12, $f4
add.s $f6, $f6, $f4
div.s $f4, $f6, $f26
# if (a == b) break;
c.eq.s $f4, $f5
bc1t sqrt_loop_end
# }
j sqrt_loop_start
sqrt_loop_end:
# return a;
mov.s $f0, $f4
jr $ra
# return 0.0;
sqrt_zero:
mov.s $f0, $f24
jr $ra
실행 예
Reference
이 문제에 관하여(어셈블리 언어(MIPS)로 두 점 거리 계산하기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/mpyw/items/e2ab8b5ece17d257032d텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)