最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

ARM匯編判斷之如何用匯編判斷數(shù)組中正負數(shù)個數(shù)

 更新時間:2022年04月21日 08:57:49   作者:IM湯姆凱特  
這篇文章主要介紹了ARM匯編判斷之如何用匯編判斷數(shù)組中正負數(shù)個數(shù),在匯編語言中程序的基本框架是不變的,這里我們可以直接把正向遍歷的程序給貼過來,然后我們思考怎么運用判斷后綴把數(shù)組中正數(shù)和負數(shù)分開,進行判斷個數(shù)和分別求和,需要的朋友可以參考下

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

寫在前面:

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

所有判斷后綴

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

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

來看看今天的問題

如何用匯編實現(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; 
}

運行結果:

1.2參照正向遍歷的框架

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

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

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)系在一塊的就是加判斷后綴的指令,這個指令可以是跳轉(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跳轉到子程序,執(zhí)行完再跳轉回來,ARM對于判斷就方便很多,可以直接加在想要比較后想要執(zhí)行的語句上。并且只需要一次比較。后面可以跟很多個,比較后想要執(zhí)行的代碼。
 

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

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

這里的寄存器分別表示:

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,那就得先調用輸出的格式串,格式串在最開始就已經(jīng)定義好。
  2. printf是從R1開始輸出的所以要把我們需要的值正負數(shù)個數(shù)、正負數(shù)和,傳遞給R1、R2。
  3. 下面部分由于已經(jīng)打印出來,所以就可以把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

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運行結果

可以看到結果是正確的!

3.總結

  • 對給定數(shù)組進行操作時,要把操作放入循環(huán)中,并且通過寄存器向后尋址的方式循環(huán)。
  • 給出了所有的判斷后綴,在ARM中可以把判斷后綴放到任意的指令后,用于判斷后的執(zhí)行操作;一條CMP指令可以跟很多條判斷執(zhí)行操作。
  • 編寫匯編時,先寫出核心代碼部分,再給主函數(shù)、全局變量、輸出語句中添加支撐條件。

到此這篇關于ARM匯編判斷之如何用匯編判斷數(shù)組中正負數(shù)個數(shù)的文章就介紹到這了,更多相關匯編判斷正負數(shù)內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 最好懂的匯編語言教程,解釋CPU如何執(zhí)行代碼

    最好懂的匯編語言教程,解釋CPU如何執(zhí)行代碼

    這篇文章主要介紹了最好懂的匯編語言教程,解釋CPU如何執(zhí)行代碼。計算機真正能夠理解的是低級語言,它專門用來控制硬件。匯編語言就是低級語言,直接描述/控制?CPU?的運行。如果你想了解?CPU?到底干了些什么,以及代碼的運行步驟,就一定要學習匯編語言。
    2022-12-12
  • 匯編程序 查表求平方的實現(xiàn)

    匯編程序 查表求平方的實現(xiàn)

    這篇文章主要介紹了匯編程序 查表求平方的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-02-02
  • 匯編語言實現(xiàn)在指定字符串中搜索字符''A''的方法

    匯編語言實現(xiàn)在指定字符串中搜索字符''A''的方法

    這篇文章主要介紹了匯編語言實現(xiàn)在指定字符串中搜索字符'A'的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-02-02
  • 用匯編語言實現(xiàn)從1加到100的方法(1+2+...+100)

    用匯編語言實現(xiàn)從1加到100的方法(1+2+...+100)

    這篇文章主要介紹了用匯編語言實現(xiàn)從1加到100的方法(1+2+...+100),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-01-01
  • 匯編語言環(huán)境搭建軟件與教程

    匯編語言環(huán)境搭建軟件與教程

    這篇文章主要介紹了匯編語言環(huán)境搭建軟件與教程,需要的朋友可以參考下
    2020-01-01
  • 匯編語言中的函數(shù)調用參數(shù)傳遞及全局與局部變量與“基址”

    匯編語言中的函數(shù)調用參數(shù)傳遞及全局與局部變量與“基址”

    這篇文章主要介紹了匯編眼中的函數(shù)調用參數(shù)傳遞以及全局與局部變量與“基址”,本文通過圖文并茂的形式給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-02-02
  • 一位數(shù)乘法的匯編語言實現(xiàn)方法

    一位數(shù)乘法的匯編語言實現(xiàn)方法

    這篇文章主要介紹了一位數(shù)乘法的匯編語言實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-02-02
  • x86匯編DOS編程環(huán)境搭建過程

    x86匯編DOS編程環(huán)境搭建過程

    在學習x86匯編時,第一步是搭建一個可以編譯、運行代碼的環(huán)境,這個搭建方法也真的超簡單,本文重點給大家介紹x86匯編DOS編程環(huán)境搭建過程,感興趣的朋友一起看看吧
    2021-11-11
  • C 表達式中的匯編指令

    C 表達式中的匯編指令

    這篇文章主要介紹了C 表達式中的匯編指令,需要的朋友可以參考下
    2020-01-01
  • 詳解匯編語言 dup偽指令

    詳解匯編語言 dup偽指令

    dup它有多種意義,包括Linux c 函數(shù)、C語言函數(shù)DUP、匯編指令、化學物質DUP。這篇文章主要介紹了匯編語言 dup偽指令的相關知識,需要的朋友可以參考下
    2020-01-01

最新評論

安阳县| 建瓯市| 东平县| 青岛市| 洪江市| 商洛市| 原平市| 图们市| 民权县| 江阴市| 淳安县| 武宁县| 铅山县| 汶上县| 芦溪县| 额敏县| 阿勒泰市| 文水县| 新民市| 阳曲县| 汤原县| 屯留县| 游戏| 连山| 延安市| 峨眉山市| 安平县| 迭部县| 习水县| 江津市| 曲水县| 新邵县| 芜湖县| 吉木萨尔县| 静宁县| 和平县| 西乌珠穆沁旗| 富锦市| 黎川县| 苍梧县| 孝义市|