溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

ARM怎么用匯編判斷數(shù)組中正負數(shù)個數(shù)

發(fā)布時間:2022-04-21 10:28:55 來源:億速云 閱讀:257 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹“ARM怎么用匯編判斷數(shù)組中正負數(shù)個數(shù)”的相關(guān)知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“ARM怎么用匯編判斷數(shù)組中正負數(shù)個數(shù)”文章能幫助大家解決問題。

    【ARM匯編】如何判斷數(shù)組中正負數(shù)個數(shù)?

    寫在前面:

    在很多算法中都必須要用到if語句進行判斷,前面我們提到了數(shù)組,也練習了用匯編的循環(huán)框架遍歷數(shù)組,但當我們運用數(shù)組時,不可能僅僅用于遍歷數(shù)組并求出數(shù)組的和。當我們對數(shù)組進行其他的一些操作時,就需要用到判斷語句,那匯編中的判斷語句是什么呢?

    所有判斷后綴

    在x86中我們只能在跳轉(zhuǎn)指令`“B”`后加上判斷符,而在ARM中我們可以在任意指令后加上判斷標識

    所有的判斷后綴,我把常用的給做了標紅:

    ARM怎么用匯編判斷數(shù)組中正負數(shù)個數(shù)

    來看看今天的問題

    如何用匯編實現(xiàn)判斷數(shù)組中正負數(shù)的個數(shù)?

    在匯編語言中程序的基本框架是不變的,我們之前寫過循環(huán)的框架,這里我們可以直接把正向遍歷的程序給貼過來,然后我們思考怎么運用判斷后綴把數(shù)組中正數(shù)和負數(shù)分開,進行判斷個數(shù)和分別求和。

    1.編前準備

    1.1用C的偽代碼表示

    先用C語言來實現(xiàn)這個功能,便于明確要實現(xiàn)功能的思路

    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("正數(shù)的個數(shù)為:%d\n負數(shù)的個數(shù)為:%d\n",z,f);
        printf("正數(shù)的和為:%d\n負數(shù)的和為:%d\n",sum1,sum2);
        return 0; 
    }

    運行結(jié)果:

    ARM怎么用匯編判斷數(shù)組中正負數(shù)個數(shù)

    1.2參照正向遍歷的框架

    學習任何東西最快速的辦法是,調(diào)取大腦中已有的知識,讓新知識跟舊知識進行對比和延伸思考。

    把正向遍歷的程序貼過來,發(fā)現(xiàn)實現(xiàn)整體功能的框架基本不變,只需要把循環(huán)中的這一部分操作改一下即可。把步驟拆開,詳細細分為下面幾步,我們一起來看一下。

    ARM怎么用匯編判斷數(shù)組中正負數(shù)個數(shù)

    2.編寫ARM匯編

    2.1先給定一串數(shù)組、輸出格式

    這里要嘗試輸出正數(shù)的個數(shù)、負數(shù)的個數(shù)以及正數(shù)之和、負數(shù)之和;數(shù)組用ary自定義;通過地址長度計算出要循環(huán)的次數(shù)

    .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

    2.2在循環(huán)中加入判斷、計數(shù)

    這一步就是核心步驟,用匯編寫if判斷語句。之前給出過所有的指令,其中CMP用來判斷。與CMP緊密聯(lián)系在一塊的就是加判斷后綴的指令,這個指令可以是跳轉(zhuǎn)(B)可以是(ADD)也可以是(MOV)。

    要實現(xiàn)的功能:把數(shù)組中的第一個值取出來,然后與零進行判斷,當大于零時,給正數(shù)的計數(shù)器加一,并且給正數(shù)的累加和加上當前數(shù)值。判斷為負數(shù)時則相反。

    ARM匯編實現(xiàn)方法:

        ldr r2,[r5],#4
            cmp r2,#0
            addgt r7,#1
            addgt r9,r2
            addlt r8,#1
            addlt r10,r2

    如果在x86中只能是CMP比較完用BLT跳轉(zhuǎn)到子程序,執(zhí)行完再跳轉(zhuǎn)回來,ARM對于判斷就方便很多,可以直接加在想要比較后想要執(zhí)行的語句上。并且只需要一次比較。后面可以跟很多個,比較后想要執(zhí)行的代碼。
     

    2.3在主函數(shù)中初始化使用的寄存器

    一般定義寄存器都是在完成核心代碼之后,查看核心代碼中用到了哪些寄存器,然后給對應(yīng)的寄存器賦初始值

    這里的寄存器分別表示:

    r7用來存放正數(shù)的個數(shù)

    r8用來存放負數(shù)的個數(shù)

    r9用來存放正數(shù)之和

    r10用來存放負數(shù)之和

    這里用到的R4和R5和之前一樣沒有變化依舊是:循環(huán)變量和數(shù)組首地址

     mov r4,#0
        mov r7,#0
        mov r8,#0
        mov r9,#0
        mov r10,#0
        ldr r5, =ary

    2.4輸出累計之和

    1. 想要打印輸出肯定是用到printf,那就得先調(diào)用輸出的格式串,格式串在最開始就已經(jīng)定義好。

    2. printf是從R1開始輸出的所以要把我們需要的值正負數(shù)個數(shù)、正負數(shù)和,傳遞給R1、R2。

    3. 下面部分由于已經(jīng)打印出來,所以就可以把R1、R2覆蓋,并且當用B跳轉(zhuǎn)一次,R0~R3的值都會變化,最好都要重寫。

    ldr r0,=fmt1
            mov r1,r7
            mov r2,r8
            bl printf
    
            ldr r0,=fmt2
            mov r1,r9
            mov r2,r10
            bl printf

    2.5源代碼

    .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

    這里我們值需要判斷正負計數(shù)即可,因為零既不屬于正數(shù)也不屬于負數(shù)

    2.6運行結(jié)果

    可以看到結(jié)果是正確的!

    ARM怎么用匯編判斷數(shù)組中正負數(shù)個數(shù)

    關(guān)于“ARM怎么用匯編判斷數(shù)組中正負數(shù)個數(shù)”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識,可以關(guān)注億速云行業(yè)資訊頻道,小編每天都會為大家更新不同的知識點。

    向AI問一下細節(jié)

    免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

    arm
    AI