【ARM匯編】如何對鍵入數據做判斷?

      網友投稿 684 2025-04-03

      每日一句:


      “我們人生的意義是什么?人生的目的在哪里?對于這個人生最基本的問題,我認為必須從正面回答。我的答案是:提升心性,磨練靈魂?!薄臼⒑头?/p>

      【ARM匯編練習】如何對鍵入數據做判斷?

      寫在前面:

      當我們從鍵盤上輸入一串數據,如何用ARM匯編語言對它進行判斷是正數還是負數,并輸出正數的個數和負數的個數。通過這次實操你可以了解對鍵入數據判斷的兩種方式,更熟悉在匯編中調用scanf使用方式,加深對判斷指令使用方法的學習。那就一起來看一下今天的問題吧!

      如何對鍵入數據的正負數做判斷?

      今天帶大家用第一種方式,把之前學過的scanf和判斷語句結合起來練習一下

      1先寫出C語言的偽代碼

      #include int main() { int z = 0,f=0, n = 0, i ;//z為正數,f為負數,n為要輸入的數,i循環的次數 printf("輸入數據:"); for (i=0;i<5;i++) { scanf("%d", &n); if (n == 0) break; else if (n > 0) z++; else f++; } printf("正數有%d個,負數有%d個", z, f); }

      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

      【ARM匯編】如何對鍵入數據做判斷?

      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小時內刪除侵權內容。

      上一篇:excel如何制作流程圖
      下一篇:excel2003自動篩選的使用教程
      相關文章
      亚洲日韩精品无码AV海量| 亚洲男人第一av网站| 亚洲色av性色在线观无码| 亚洲女同成av人片在线观看| 亚洲 综合 国产 欧洲 丝袜| 午夜亚洲WWW湿好爽| 亚洲av无码专区亚洲av不卡| 亚洲中文字幕AV每天更新| 亚洲免费在线视频观看| 亚洲w码欧洲s码免费| 亚洲a级片在线观看| 色天使亚洲综合在线观看| 中文字幕亚洲综合小综合在线| 亚洲一区二区免费视频| 亚洲人成7777| 亚洲一区二区无码偷拍| 亚洲精品永久在线观看| 亚洲AV综合永久无码精品天堂| 亚洲av成人一区二区三区观看在线| 亚洲AV无码一区二区三区网址| 精品久久久久久久久亚洲偷窥女厕| 国产成人人综合亚洲欧美丁香花| 国产成人不卡亚洲精品91| 亚洲日本中文字幕一区二区三区 | 亚洲人成网站在线观看播放青青| 亚洲欧洲国产综合| 亚洲乱码卡三乱码新区| 最新亚洲卡一卡二卡三新区| 亚洲人成色99999在线观看| 亚洲Av永久无码精品黑人| 大胆亚洲人体视频| 国产精品亚洲mnbav网站| 精品国产亚洲一区二区三区 | 亚洲国产天堂在线观看| 久久精品国产亚洲av高清漫画| 亚洲图片校园春色| 亚洲 欧洲 视频 伦小说| 欧美激情综合亚洲一二区| 亚洲视频在线一区二区| 久久精品亚洲综合| 亚洲国产日韩在线人成下载|