【ARM匯編應用】調用C語言中的scanf函數
凡有的,還要加倍給他,叫他多余;沒有的,連他所有的也要奪過來——《新約·馬太福音》
寫在前面
大家都知道,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匯編的循環運用】正向遍歷|逆向遍歷
ARM 匯編語言
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。