Cetak Newline untuk program perakitan Armv7

Saya sedang mengerjakan program perakitan armv7 yang menemukan pembagi persekutuan terbesar (gcd) dari dua bilangan bulat. Semuanya berfungsi dengan baik kecuali untuk fungsi baris baru. Ketika saya merakit dan menjalankan program, program tidak mencetak baris baru apa pun, hanya bilangan bulat dalam satu baris. Ada saran tentang bagaimana saya bisa memperbaikinya?

  .global _start
_start:
    mov r2, #24     @first set of integers
    mov r4, #18
    bl mysub1
    bl mysub2
    bl mysub3

    mov r2, #78     @second set of integers
    mov r4, #34
    bl mysub1
    bl mysub2
    bl mysub3

    mov r2, #99     @third set of integers
    mov r4, #36
    bl mysub1
    bl mysub2
    bl mysub3

_exit:
    mov r7, #1
    swi 0


mysub1:             @subroutine to find gcd
    cmp r2, r4
    beq done
    bgt greater
    blt less
greater:
    sub r2, r2, r4
    bal mysub1

less:
    sub r4, r4, r2
    bal mysub1
done:
    bx lr

mysub2:             @subroutine to convert gcd result to ascii value
    add r4, #48
    ldr r9, =store
    str r4, [r9]

    mov r7, #4      @print out a newline
    mov r0, #1
    mov r2, #1
    ldr r1, =newline
    swi 0

    bx lr

mysub3:             @subroutine to print out the ascii value
    mov r7, #4
    mov r0, #1
    mov r2, #2
    ldr r1, =store
    swi 0

    bx lr


    .data
store:
    .space 2

newline:
    .ascii "\n"

person Breezyb12    schedule 26.11.2017    source sumber
comment
Sistem operasi apa yang Anda programkan? Anda sebenarnya bisa memberi nama yang lebih deskriptif pada fungsi Anda. mysub1, mysub2, dan mysub3 adalah nama yang tidak berguna.   -  person fuz    schedule 26.11.2017
comment
@fuz Saya hanya menggunakan raspberry pi yang beroperasi pada raspbian. Saya tahu subs saya tidak masuk akal, itu sebabnya saya memberi komentar di sampingnya.   -  person Breezyb12    schedule 26.11.2017
comment
Coba ganti nama fungsi Anda!   -  person fuz    schedule 26.11.2017
comment
@fuz itu tidak memperbaikinya!   -  person Breezyb12    schedule 26.11.2017
comment
Mengganti nama fungsi bertujuan untuk membuat kode lebih mudah dipahami orang lain, bukan secara langsung memperbaiki bug.   -  person fuz    schedule 27.11.2017


Jawaban (1)


Ini adalah pelakunya:

add r4, #48
ldr r9, =store
str r4, [r9]

Kode ini memiliki dua bug:

  • ini hanya berfungsi untuk angka antara 0 dan 9
  • str r4, [r9] menyimpan empat byte ke store, menimpa baris baru tepat setelah buffer dua byte.

Untuk mengatasi masalah pertama, Anda perlu melakukan pembagian dengan sisanya untuk memisahkan angka di r4 menjadi dua digit. Untuk memperbaiki masalah kedua, gunakan strb atau strh untuk menyimpan byte atau setengah kata agar tidak membebani buffer.

person fuz    schedule 26.11.2017
comment
@ Breezyb12 Pada dasarnya, Anda membagi r4 dengan sepuluh. Hasil bagi adalah digit pertama Anda, sisanya adalah digit kedua. Jika Anda memiliki lebih dari dua digit, Anda perlu membaginya beberapa kali. Lihat jawaban ini untuk mengetahui caranya lakukan ini jika CPU Anda tidak memiliki instruksi udiv atau sdiv. - person fuz; 26.11.2017
comment
mengerti, Terima kasih banyak! - person Breezyb12; 26.11.2017