Die ARM-Assembly ruft die scanf-Funktion in der Sprache C auf

  Über den Autor: Hallo zusammen, ich bin IM Tom Kate, Sie können mich Tom nennen.
 Persönliche Homepage: IM Tom Kates CSDN-Blogserien
 -Kolumne: [ARM Embedded Foundation]
 Täglicher Satz:

Wer hat, dem wird er doppelt gegeben, wer nicht hat, dem wird auch das genommen, was er hat - „Neues Testament, Matthäus-Evangelium“

 vorne schreiben

Wie wir alle wissen, gehört die Assemblierung zur unmittelbar untersten Schicht der Sprache C. Assemblierung ist nicht nur die Grundlage der Sprache C, sondern auch der Eckpfeiler des Computerbetriebs.

Da C und Assembler so nah beieinander liegen, müssen wir lernen, Funktionen in der C-Sprache zu assemblieren und aufzurufen, damit wir mehr Funktionen erreichen können.

Heute zeige ich Ihnen, wie Sie die scanf-Funktion in der ARM-Assemblersprache aufrufen.

Wir lernen noch am Beispiel „zwei Zahlen über die Tastatur eingeben, summieren und ausgeben“.

        Hier wird die Funktion scanf verwendet.Die Definition von scanf ist: Eingabe von Daten in die angegebene Variable von der Tastatur in dem vom Benutzer angegebenen Format.

Verwendung von scanf in ARM

1. In der ARM-Assembly werden die von scanf eingegebenen Daten im Speicher gespeichert. Wenn im Speicher eine Variable definiert ist, wird sie in der Variablen gespeichert. Wenn sie nicht definiert ist, wird sie zufällig in einer Adresse gespeichert , daher muss zuerst definiert werden, wo es im Speicher gespeichert werden soll.

2. Wie printf können Sie BL scanf direkt zum Aufrufen verwenden, aber jedes Mal, wenn Sie BL zum Springen verwenden, müssen Sie R0~R3 einmal neu definieren, und Sie können nur R1~R3 ​​verwenden, um Parameter zu übergeben

Nachdem Sie die Verwendung von scanf in ARM kennen, nehmen wir Sie mit, um die ARM-Assembly „Geben Sie zwei Zahlen über die Tastatur ein, summieren und ausgeben“ zu schreiben.

Der erste Schritt besteht darin, den Rahmen herauszuholen

  • Früher eingeführt, das Grundgerüst der Montage, [ ARM-Montage-Grundgerüst und die Summe zweier Zahlen ]
  • Hier ist ein neues Programmier-Framework für die ARM-Assemblierung, das mit dem vorherigen identisch ist: Push und Pop werden verwendet, um einfach Stack-Push und Pop zu ersetzen.
.data
    ………………
.text
.globl main
 main: 
   push {lr}                
     ………………  
   mov r0, #0             
   pop  {lr}           
   mov pc, lr   
.end

Der zweite Schritt besteht darin, globale Variablen und symbolische Konstanten zu deklarieren

  • 1. Deklarieren Sie zunächst die Ein- und Ausgabeformate von printf und scanf
  • 2. Da Sie scanf aufrufen möchten, um zwei Zahlen einzugeben, müssen Sie zuerst zwei Variablen im Speicher definieren
.data
    fmt:.asciz "\n  sum=%d\n"
    fmt1:.asciz "%d %d"
    a:.word 0
    b:.word 0

Geben Sie im dritten Schritt zwei Zahlen ein und speichern Sie sie im Speicher

  • Beim Übergeben von Parametern können nur R0~R3 verwendet werden.Beim Aufrufen von scanf muss zuerst die Adresse der Variablen im Speicher zum Speichernder Eingabedaten in das Register geholt werden.
        ldr r0, =fmt1
        ldr r1,=a 
        ldr r2,=b 
        bl scanf

Der vierte Schritt, Daten aus dem Speicher lesen

  • Wie im vorherigen Artikel erwähnt, erfordert das Abrufen von Daten aus dem Speicher zwei Schritte, zuerst das Abrufen der Adresse durch den LDR-Pseudobefehl und dann das Übergeben des Werts an das Register für den Betrieb durch indirekte Adressierung.
    ldr r1,=a 
    ldr r1,[r1]
    ldr r2,=b 
    ldr r2,[r2]

Der fünfte Schritt, Betrieb und Ausgabe

    add r2,r1
        ldr r0,=fmt
        mov r1,r2
        bl printf

R0~R15 sind im Wesentlichen Aliase für Adressen. Hierbei ist zu beachten, dass sich die Werte in R0~R3 bei jedem Aufruf des B-Befehls ändern, also neu zugewiesen werden müssen

Die Ergebnisse der Operation werden nicht jedem angezeigt. Sie können versuchen zu tippen. Wenn es ein Problem gibt, können Sie es mir über den Kommentarbereich mitteilen.


Verwenden Sie schließlich die Implementierung von „drei Zahlen eingeben und dann Summeneingabe“, um zu überprüfen, ob wir es gelernt haben!


Quellcode:

.data
    fmt:.asciz "\n  sum=%d\n"
    fmt1:.asciz "%d %d %d"
    a:.word 0
    b:.word 0
    c:.word 0
.text
.globl main
main:
    stmfd sp!,{lr}
        ldr r0, =fmt1
        ldr r1,=a 
        ldr r2,=b 
        ldr r3,=c
        bl scanf
    ldr r1,=a 
    ldr r1,[r1]
    ldr r2,=b 
    ldr r2,[r2]
    ldr r3,=c
    ldr r3,[r3]
    add r2,r1
    add r3,r2
        ldr r0,=fmt
        mov r1,r3
        bl printf
    mov r0,#0
    ldmfd sp!,{lr}
    mov pc,lr
.end

Ergebnis:


Dieses Problem ist beendet. Wenn es für Sie hilfreich ist, liken Sie es + kommentieren Sie, um den Blogger zu unterstützen, und gehen Sie.

Folgen Sie Toms Freunden noch nicht, klicken Sie zum Folgen und lernen Sie jeden Tag eine kleine Zusammenstellung

Nächster Hinweis: [ Zyklusanwendung der ARM-Baugruppe] Vorwärtsdurchlauf | Rückwärtsdurchlauf

Supongo que te gusta

Origin blog.csdn.net/GRT609/article/details/124160130
Recomendado
Clasificación