您好,登錄后才能下訂單哦!
這篇文章主要介紹“ARM怎么用匯編判斷數組中正負數個數”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“ARM怎么用匯編判斷數組中正負數個數”文章能幫助大家解決問題。
在很多算法中都必須要用到if語句進行判斷,前面我們提到了數組,也練習了用匯編的循環框架遍歷數組,但當我們運用數組時,不可能僅僅用于遍歷數組并求出數組的和。當我們對數組進行其他的一些操作時,就需要用到判斷語句,那匯編中的判斷語句是什么呢?
在x86中我們只能在跳轉指令`“B”`后加上判斷符,而在ARM中我們可以在任意指令后加上判斷標識
所有的判斷后綴,我把常用的給做了標紅:
來看看今天的問題
在匯編語言中程序的基本框架是不變的,我們之前寫過循環的框架,這里我們可以直接把正向遍歷的程序給貼過來,然后我們思考怎么運用判斷后綴把數組中正數和負數分開,進行判斷個數和分別求和。
先用C語言來實現這個功能,便于明確要實現功能的思路
C語言代碼:
#include<stdio.h> int main(){ int ary[10] = {0,-1,2,3,4,5,-6,7,8,9}; int sum1=0,sum2=0, i; int z=0,f=0; for ( i = 0; i < 10; i++) { if(ary[i]>0){ z=z+1; sum1 =sum1 +ary[i]; } else if(ary[i]<0){ f=f+1; sum2 =sum2 +ary[i]; } } printf("正數的個數為:%d\n負數的個數為:%d\n",z,f); printf("正數的和為:%d\n負數的和為:%d\n",sum1,sum2); return 0; }
運行結果:
學習任何東西最快速的辦法是,調取大腦中已有的知識,讓新知識跟舊知識進行對比和延伸思考。
把正向遍歷的程序貼過來,發現實現整體功能的框架基本不變,只需要把循環中的這一部分操作改一下即可。把步驟拆開,詳細細分為下面幾步,我們一起來看一下。
這里要嘗試輸出正數的個數、負數的個數以及正數之和、負數之和;數組用ary自定義;通過地址長度計算出要循環的次數
.data 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" ary:.word 0,-1,2,3,4,-5,6,7,8,-9 .equ counter,( . - ary)/4
這一步就是核心步驟,用匯編寫if判斷語句。之前給出過所有的指令,其中CMP用來判斷。與CMP緊密聯系在一塊的就是加判斷后綴的指令,這個指令可以是跳轉(B)可以是(ADD)也可以是(MOV)。
要實現的功能:把數組中的第一個值取出來,然后與零進行判斷,當大于零時,給正數的計數器加一,并且給正數的累加和加上當前數值。判斷為負數時則相反。
ARM匯編實現方法:
ldr r2,[r5],#4 cmp r2,#0 addgt r7,#1 addgt r9,r2 addlt r8,#1 addlt r10,r2
如果在x86中只能是CMP比較完用BLT跳轉到子程序,執行完再跳轉回來,ARM對于判斷就方便很多,可以直接加在想要比較后想要執行的語句上。并且只需要一次比較。后面可以跟很多個,比較后想要執行的代碼。
一般定義寄存器都是在完成核心代碼之后,查看核心代碼中用到了哪些寄存器,然后給對應的寄存器賦初始值
這里的寄存器分別表示:
r7用來存放正數的個數
r8用來存放負數的個數
r9用來存放正數之和
r10用來存放負數之和
這里用到的R4和R5和之前一樣沒有變化依舊是:循環變量和數組首地址
mov r4,#0 mov r7,#0 mov r8,#0 mov r9,#0 mov r10,#0 ldr r5, =ary
想要打印輸出肯定是用到printf,那就得先調用輸出的格式串,格式串在最開始就已經定義好。
printf是從R1開始輸出的所以要把我們需要的值正負數個數、正負數和,傳遞給R1、R2。
下面部分由于已經打印出來,所以就可以把R1、R2覆蓋,并且當用B跳轉一次,R0~R3的值都會變化,最好都要重寫。
ldr r0,=fmt1 mov r1,r7 mov r2,r8 bl printf ldr r0,=fmt2 mov r1,r9 mov r2,r10 bl printf
.data 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" ary:.word 0,-1,2,3,4,-5,6,7,8,-9 .equ counter,( . - ary)/4 .text .globl main main: stmfd sp!,{lr} mov r4,#0 mov r7,#0 mov r8,#0 mov r9,#0 mov r10,#0 ldr r5, =ary b testfor loop: ldr r2,[r5],#4 cmp r2,#0 addgt r7,#1 addgt r9,r2 addlt r8,#1 addlt r10,r2 add r4,#1 testfor:cmp r4,#counter blt loop ldr r0,=fmt1 mov r1,r7 mov r2,r8 bl printf ldr r0,=fmt2 mov r1,r9 mov r2,r10 mov r0, #0 ldmfd sp!,{lr} mov pc, lr .end
這里我們值需要判斷正負計數即可,因為零既不屬于正數也不屬于負數
可以看到結果是正確的!
關于“ARM怎么用匯編判斷數組中正負數個數”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。