【ARM匯編】如何對鍵入數據做判斷?
每日一句:

“我們人生的意義是什么?人生的目的在哪里?對于這個人生最基本的問題,我認為必須從正面回答。我的答案是:提升心性,磨練靈魂?!薄臼⒑头?/p>
【ARM匯編練習】如何對鍵入數據做判斷?
寫在前面:
當我們從鍵盤上輸入一串數據,如何用ARM匯編語言對它進行判斷是正數還是負數,并輸出正數的個數和負數的個數。通過這次實操你可以了解對鍵入數據判斷的兩種方式,更熟悉在匯編中調用scanf使用方式,加深對判斷指令使用方法的學習。那就一起來看一下今天的問題吧!
如何對鍵入數據的正負數做判斷?
今天帶大家用第一種方式,把之前學過的scanf和判斷語句結合起來練習一下
1先寫出C語言的偽代碼
#include
2.框架
上一篇我們實現了《對給定數組進行遍歷,得出正負數的個數》
我們之前說過,學習新知識最快的辦法是在已有的知識上遷移比對。因此《ARM嵌入式基礎》這一專欄的內容是循序漸進的,每天學一點匯編加強對整體計算機結構的了解。
我們看一下,如果想要實現今天的功能,能用上一篇文章代碼的哪一部分呢?
因為我們同《對給定數組進行遍歷,得出正負數的個數》一樣
也是要進行判斷、計數、輸出
,所以紅框部分代碼不需要變。
不同的是,我們這里沒有數組,而是單獨的一個數,需要做的就是
把這個數放到循環中,并且給出支撐這個數的指令和支撐scanf的指令
。
理清了思路我們來看一下具體怎么實現
3.修改全局變量
1.把數組改為單獨的一個數即可
2.聲明scanf的格式串
.data fmt:.asciz "%d\n" fmt1:.asciz " The number of positive:%d\n The number of negative:%d\n" fmt2:.asciz " The positive and:%d\n The negative and:%d\n" a:.word 0
4.循環中調用scanf
調用scanf,必須給它獲取到的值分配內存空間,在全局變量中已經聲明a,這里我們需要把a的地址給r1,這樣就可以將獲取到的值傳給a。
ldr r0,=fmt ldr r1,=a bl scanf
5.對獲取到的值進行判斷
先將獲取到的值存到了a中,想要對它進行判斷,就要先獲取到地址然后獲取到內容。
由于調用過一次B,因此易失寄存器的值會改變,所以這里需要重新獲取一次地址。
b testfor loop: ldr r0,=fmt ldr r1,=a bl scanf ldr r1,=a ldr r2,[r1] cmp r2,#0 addgt r7,#1 addgt r9,r2 addlt r8,#1 addlt r10,r2
1.把分配內存的地址,先傳給不易失寄存器。
2.scanf再用r1傳到這個地址中。
3.所以就可以直接將不易失寄存器中的值取出來,用于判斷。
ldr r5, =a b testfor loop: ldr r0,=fmt ldr r1,=a bl scanf ldr r2,[r5] cmp r2,#0 addgt r7,#1 addgt r9,r2 addlt r8,#1 addlt r10,r2
6.源代碼
.data fmt:.asciz "%d\n" fmt1:.asciz " The number of positive:%d\n The number of negative:%d\n" fmt2:.asciz " The positive and:%d\n The negative and:%d\n" a:.word 0 .text .globl main main: stmfd sp!,{lr} mov r4,#0 mov r7,#0 mov r8,#0 mov r9,#0 mov r10,#0 ldr r5, =a b testfor loop: ldr r0,=fmt ldr r1,=a bl scanf ldr r2,[r5] cmp r2,#0 addgt r7,#1 addgt r9,r2 addlt r8,#1 addlt r10,r2 add r4,#1 testfor:cmp r4,#5 blt loop ldr r0,=fmt1 mov r1,r7 mov r2,r8 bl printf ldr r0,=fmt2 mov r1,r9 mov r2,r10 bl printf mov r0, #0 ldmfd sp!,{lr} mov pc, lr .end
7.運行驗證
這里需要注意的是,當循環五次后,還得鍵入一個任意字符用于結束循環。我們后面講到先將鍵入數據存到數組中就會避免這種事情發生。
總結
對鍵入數據進行判斷有兩種方式,這里用到的是實時判斷然后累計
練習了對C語言函數的調用和判斷后綴使用
使我們產生一個疑問:輸入結束需要鍵入一個隨機字符才能結束循環,怎么產生的?怎么才能避免?
ARM 嵌入式 匯編語言
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。