พิมพ์ Newline สำหรับโปรแกรมประกอบ Armv7

ฉันกำลังเขียนโปรแกรมประกอบ armv7 ซึ่งค้นหาตัวหารร่วมมาก (gcd) ของจำนวนเต็มสองตัว ทุกอย่างทำงานได้ดียกเว้นฟังก์ชันขึ้นบรรทัดใหม่ เมื่อฉันประกอบและรันโปรแกรม มันจะไม่พิมพ์บรรทัดใหม่ มีเพียงจำนวนเต็มในบรรทัดเดียว ข้อเสนอแนะใด ๆ เกี่ยวกับวิธีที่ฉันจะแก้ไขได้อย่างไร

  .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 แหล่งที่มา
comment
คุณเขียนโปรแกรมระบบปฏิบัติการอะไร? คุณสามารถตั้งชื่อที่สื่อความหมายให้กับฟังก์ชันของคุณได้มากขึ้น mysub1, mysub2 และ mysub3 เป็นชื่อที่ค่อนข้างไร้ประโยชน์   -  person fuz    schedule 26.11.2017
comment
@fuz ฉันแค่ใช้ราสเบอร์รี่ pi ที่ทำงานบนราสเบียน ฉันรู้ว่าสมาชิกของฉันไม่สมเหตุสมผล ฉันจึงใส่ความคิดเห็นไว้ข้างพวกเขา   -  person Breezyb12    schedule 26.11.2017
comment
ลองเปลี่ยนชื่อฟังก์ชันของคุณแทน!   -  person fuz    schedule 26.11.2017
comment
@fuz ที่ไม่ได้แก้ไข!   -  person Breezyb12    schedule 26.11.2017
comment
การเปลี่ยนชื่อฟังก์ชันเป็นเรื่องเกี่ยวกับการทำให้โค้ดเข้าใจง่ายขึ้นสำหรับผู้อื่น ไม่ใช่การแก้ไขข้อบกพร่องโดยตรง   -  person fuz    schedule 27.11.2017


คำตอบ (1)


นี่คือต้นเหตุ:

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

รหัสนี้มีข้อบกพร่องสองประการ:

  • ใช้ได้กับตัวเลขระหว่าง 0 ถึง 9 เท่านั้น
  • str r4, [r9] เก็บสี่ไบต์ไว้ที่ store โดยเขียนทับบรรทัดใหม่หลังบัฟเฟอร์สองไบต์

ในการแก้ไขปัญหาแรก คุณจะต้องหารส่วนที่เหลือเพื่อแยกตัวเลขใน r4 ออกเป็นสองหลัก ในการแก้ไขปัญหาที่สอง ให้ใช้ strb หรือ strh เพื่อจัดเก็บไบต์หรือ halfword แทน เพื่อไม่ให้บัฟเฟอร์มากเกินไป

person fuz    schedule 26.11.2017
comment
@ Breezyb12 โดยพื้นฐานแล้วคุณหาร r4 ด้วยสิบ ผลหารคือหลักแรกของคุณ ส่วนที่เหลือคือหลักที่สองของคุณ หากคุณมีมากกว่าสองหลัก คุณจะต้องหารหลายครั้ง ดูคำตอบนี้สำหรับวิธี ให้ทำเช่นนี้หาก CPU ของคุณไม่มีคำสั่ง udiv หรือ sdiv - person fuz; 26.11.2017
comment
เข้าใจแล้ว ขอบคุณมาก! - person Breezyb12; 26.11.2017