어셈블리 언어(MIPS)로 두 점 거리 계산하기

9319 단어 assemblyMIPS
대학 과제용(재수리)

정수 버전


영수를 버리다.

소스 코드

# データセクション
.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

실행 예


좋은 웹페이지 즐겨찾기