欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

寫(xiě)在前面:

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

所有判斷后綴

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

所有的判斷后綴,我把常用的給做了標(biāo)紅:

來(lái)看看今天的問(wèn)題

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

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

1.編前準(zhǔn)備

1.1用C的偽代碼表示

先用C語(yǔ)言來(lái)實(shí)現(xiàn)這個(gè)功能,便于明確要實(shí)現(xiàn)功能的思路

C語(yǔ)言代碼:

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

運(yùn)行結(jié)果:

1.2參照正向遍歷的框架

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

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

2.編寫(xiě)ARM匯編

2.1先給定一串?dāng)?shù)組、輸出格式

這里要嘗試輸出正數(shù)的個(gè)數(shù)、負(fù)數(shù)的個(gè)數(shù)以及正數(shù)之和、負(fù)數(shù)之和;數(shù)組用ary自定義;通過(guò)地址長(zhǎng)度計(jì)算出要循環(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)中加入判斷、計(jì)數(shù)

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

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

ARM匯編實(shí)現(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)回來(lái),ARM對(duì)于判斷就方便很多,可以直接加在想要比較后想要執(zhí)行的語(yǔ)句上。并且只需要一次比較。后面可以跟很多個(gè),比較后想要執(zhí)行的代碼。
 

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

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

這里的寄存器分別表示:

r7用來(lái)存放正數(shù)的個(gè)數(shù)

r8用來(lái)存放負(fù)數(shù)的個(gè)數(shù)

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

r10用來(lái)存放負(fù)數(shù)之和

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

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

2.4輸出累計(jì)之和

  1. 想要打印輸出肯定是用到printf,那就得先調(diào)用輸出的格式串,格式串在最開(kāi)始就已經(jīng)定義好。
  2. printf是從R1開(kāi)始輸出的所以要把我們需要的值正負(fù)數(shù)個(gè)數(shù)、正負(fù)數(shù)和,傳遞給R1、R2。
  3. 下面部分由于已經(jīng)打印出來(lái),所以就可以把R1、R2覆蓋,并且當(dāng)用B跳轉(zhuǎn)一次,R0~R3的值都會(huì)變化,最好都要重寫(xiě)。
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

這里我們值需要判斷正負(fù)計(jì)數(shù)即可,因?yàn)榱慵炔粚儆谡龜?shù)也不屬于負(fù)數(shù)

2.6運(yùn)行結(jié)果

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

3.總結(jié)

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

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

相關(guān)文章

  • 計(jì)算機(jī)系統(tǒng)匯編語(yǔ)言和機(jī)器語(yǔ)言深入理解

    計(jì)算機(jī)系統(tǒng)匯編語(yǔ)言和機(jī)器語(yǔ)言深入理解

    這篇文章主要為大家介紹了計(jì)算機(jī)系統(tǒng)匯編語(yǔ)言和機(jī)器語(yǔ)言深入理解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • 匯編實(shí)現(xiàn)冒泡排序的方法示例

    匯編實(shí)現(xiàn)冒泡排序的方法示例

    這篇文章主要介紹了匯編實(shí)現(xiàn)冒泡排序的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • 匯編語(yǔ)言乘指令 MUL、IMUL的具體使用

    匯編語(yǔ)言乘指令 MUL、IMUL的具體使用

    這篇文章主要介紹了匯編語(yǔ)言乘指令 MUL、IMUL的具體使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • 匯編語(yǔ)言 and和or邏輯運(yùn)算指令的實(shí)現(xiàn)

    匯編語(yǔ)言 and和or邏輯運(yùn)算指令的實(shí)現(xiàn)

    這篇文章主要介紹了匯編語(yǔ)言 and,or邏輯運(yùn)算指令的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • 純匯編實(shí)現(xiàn)打飛機(jī)小游戲的示例代碼

    純匯編實(shí)現(xiàn)打飛機(jī)小游戲的示例代碼

    這篇文章主要介紹了純匯編實(shí)現(xiàn)打飛機(jī)小游戲的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • Debug的基本使用()

    Debug的基本使用()

    Debug是一個(gè)通過(guò)操作系統(tǒng)(os)對(duì)cpu寄存器進(jìn)行訪(fǎng)問(wèn)用于學(xué)習(xí)匯編的程序,但是如今的win10(64位)已經(jīng)不支持cmd打開(kāi)debug,但是我們可以通過(guò)DOSBOX模擬器對(duì)其進(jìn)行訪(fǎng)問(wèn)
    2023-08-08
  • 淺析ELF轉(zhuǎn)二進(jìn)制允許把 Binary 文件加載到任意位置

    淺析ELF轉(zhuǎn)二進(jìn)制允許把 Binary 文件加載到任意位置

    本文通過(guò) eip + 偏移地址 實(shí)現(xiàn)了運(yùn)行時(shí)計(jì)算數(shù)據(jù)地址,不再需要把 Binary 文件裝載到固定的位置。本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2020-02-02
  • 匯編語(yǔ)言中cmp指令用法筆記與總結(jié)

    匯編語(yǔ)言中cmp指令用法筆記與總結(jié)

    這篇文章主要介紹了匯編語(yǔ)言中cmp指令用法,結(jié)合實(shí)例形式總結(jié)分析了匯編語(yǔ)言cmp指令基本功能、使用方法及操作注意事項(xiàng),需要的朋友可以參考下
    2020-01-01
  • 匯編語(yǔ)言80x86系統(tǒng)通用數(shù)據(jù)傳送指令詳解

    匯編語(yǔ)言80x86系統(tǒng)通用數(shù)據(jù)傳送指令詳解

    這篇文章主要為大家介紹了匯編語(yǔ)言80x86系統(tǒng)通用的數(shù)據(jù)傳送指令詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2021-11-11
  • asm基礎(chǔ)——匯編指令之in/out指令

    asm基礎(chǔ)——匯編指令之in/out指令

    這篇文章主要介紹了asm基礎(chǔ)——匯編指令之in/out指令,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01

最新評(píng)論