【ARM匯編應用】調用C語言中的scanf函數

      網友投稿 1043 2025-03-31

      凡有的,還要加倍給他,叫他多余;沒有的,連他所有的也要奪過來——《新約·馬太福音》

      寫在前面

      大家都知道,C語言的直接底層屬于匯編,匯編不僅僅是C語言的基礎,也是計算機運行的基石。

      既然C和匯編這么近,那我們必然要學會匯編調用C語言的函數,來方便我們實現更多功能。

      今天給大家介紹怎么用ARM匯編語言調用scanf函數。

      我們仍然用《從鍵盤上輸入兩個數,求和然后輸出》這個例子來學習

      這里就用到了scanf函數,scanf的定義是:

      按用戶指定的格式從鍵盤上把數據輸入到指定的變量之中。

      ARM中scanf的用法

      1.在ARM匯編中用scanf輸入的數據存儲到內存中,如果在內存中有定義變量,就會存到變量中,如果沒有定義隨機存儲到一個地址,所以要先在內存中定義存到哪

      2.跟printf一樣可以直接使用 BL scanf 調用,但是每當用BL跳轉一次都要重新定義一次R0~R3,傳遞參數只能用R1~R3

      知道了關于scanf在ARM中的用法,下面就帶著大家來寫一寫ARM匯編的《從鍵盤上輸入兩個數,求和然后輸出》

      第一步,把框架給搞出來

      前面給大家介紹了,匯編的基本框架,【ARM匯編基本框架與兩數求和】

      這里給大家一個新的ARM匯編的編程框架,跟之前的道理是一樣的,把壓棧和彈出用push和pop簡潔替代了

      .data ……………… .text .globl main main: push {lr} ……………… mov r0, #0 pop {lr} mov pc, lr .end

      第二步,聲明全局變量和符號常量

      1.先把printf和scanf的輸入輸出格式聲明好

      2.由于想要調用scanf輸入兩個數,所以必須先在內存中定義兩個變量

      .data fmt:.asciz "\n sum=%d\n" fmt1:.asciz "%d %d" a:.word 0 b:.word 0

      第三步,輸入兩個數存到內存中

      在傳遞參數時只能用R0~R3,在調用scanf時必須要將內存中要存放輸入數據的變量地址先取到寄存器中。

      ldr r0, =fmt1 ldr r1,=a ldr r2,=b bl scanf

      第四步,從內存中讀取數據

      上一篇說到過,從內存中取數據需要兩步,先通過LDR偽指令取地址,然后通過間接尋址的方式把值傳給寄存器進行運算。

      ldr r1,=a ldr r1,[r1] ldr r2,=b ldr r2,[r2]

      第五步,運算然后輸出

      add r2,r1 ldr r0,=fmt mov r1,r2 bl printf

      R0~R15本質上就是地址的別名。這里要注意,每次調用B指令時,R0~R3中的值都會變化,所以一定要重新進行賦值

      運行的結果就不給大家看了,大家可以試著敲一下,如果哪里有問題可以通過評論區告訴我。

      最后,用實現《輸入三個數然后求和輸入》來驗證我們是否學會呀!

      源代碼:

      .data fmt:.asciz "\n sum=%d\n" fmt1:.asciz "%d %d %d" a:.word 0 b:.word 0 c:.word 0 .text .globl main main: stmfd sp!,{lr} ldr r0, =fmt1 ldr r1,=a ldr r2,=b ldr r3,=c bl scanf ldr r1,=a ldr r1,[r1] ldr r2,=b ldr r2,[r2] ldr r3,=c ldr r3,[r3] add r2,r1 add r3,r2 ldr r0,=fmt mov r1,r3 bl printf mov r0,#0 ldmfd sp!,{lr} mov pc,lr .end

      結果:

      【ARM匯編應用】調用C語言中的scanf函數

      本期就結束了,如果對您有幫助,+評論支持一下博主再走吧

      還沒有關注湯姆的朋友,點個關注每天學一點匯編

      下期預告:【ARM匯編的循環運用】正向遍歷|逆向遍歷

      ARM 匯編語言

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:OKR 打造更富生機的企業文化(用友軟件)
      下一篇:Excel中快速創建步驟圖
      相關文章
      午夜亚洲乱码伦小说区69堂| 亚洲一区二区三区高清视频| 亚洲色偷偷偷综合网| 亚洲av无码av制服另类专区| 亚洲无人区一区二区三区| 国产成人亚洲综合a∨| 亚洲乱亚洲乱妇无码| 亚洲伊人久久大香线蕉AV| 亚洲精品中文字幕乱码| 亚洲精品第五页中文字幕| 亚洲色偷偷av男人的天堂| 亚洲黄色中文字幕| 亚洲神级电影国语版| 亚洲毛片免费视频| 亚洲午夜在线一区| 亚洲一区二区三区在线观看蜜桃| 亚洲国产成人手机在线电影bd| 亚洲自偷自拍另类图片二区| 亚洲综合一区二区精品久久| 亚洲美女一区二区三区| 亚洲系列国产精品制服丝袜第| 亚洲综合综合在线| 中中文字幕亚洲无线码| 男人天堂2018亚洲男人天堂| 亚洲国产aⅴ成人精品无吗| 国产精品亚洲精品爽爽| 妇女自拍偷自拍亚洲精品| 亚洲第一网站男人都懂| 久久综合亚洲色HEZYO国产| 亚洲成AV人片在WWW色猫咪| 亚洲国产女人aaa毛片在线| 亚洲国产精品综合久久2007| 亚洲国产91在线| 亚洲乱码中文字幕在线| 国产精品亚洲综合| 国产av无码专区亚洲av果冻传媒 | 爱情岛论坛网亚洲品质自拍| 亚洲一级Av无码毛片久久精品| 黑人大战亚洲人精品一区 | 亚洲国产精品成人综合久久久 | 亚洲中文字幕无码一去台湾|