arm 實戰彙編記憶體操作
1、 使用工具arm ads
記憶體操作就是跟暫存器之間的轉換,有暫存器和記憶體的轉換,也有記憶體和暫存器之間的轉換。
記憶體和暫存器之間分為:單暫存器的操作、多暫存器的操作
單暫存器的操作分為:
ldr rn,addn 按照字長讀取
例子: mov r1,0x12
ldrr0,[r1]
結果是將r1的記憶體位址給r0,這個就是之前提到的小端模式
什麼是小端模式就是低位放低位址,高位放高位址
記憶體的值是以字長度而來的
strrn,addn
例子: mov r1,#0x12
str r1,[r0,#0x0c]
結果是把#0x12的值寫到0x0c記憶體位址內
ldrb rn,addn 按照位元組長讀取
例子: mov r1,0x12
ldrbr0,[r1]
結果是將ff記憶體位址給r0暫存器
strb rn,addn 按照位元組長讀取
例子: mov r1,0x12
strbr0,[r1]
結果是將r0暫存器位址00給r1記憶體中的ff位
ldrh rn,addn按照半位元組長讀取
例子: mov r1,0x12
ldrbr0,[r1]
結果是將ffef0000記憶體位址給r0暫存器
strh rn,addn 按照半位元組長讀取
例子: mov r1,0x12
ldrbr0,[r1]
結果是將r0暫存器位址0000給r1記憶體中的ffef位
多暫存器的操作分為:
1) 資料塊的模式為ia(傳輸位址之後加4)
2) 資料塊的模式為ib(傳送位址之前加4)
3) 資料塊的模式為da(傳送後位址減4)
4) 資料塊的模式為db(傳送前位址減4)
堆疊模式分為:
1) ea(空遞減堆疊)
2) eb(滿遞減堆疊)
3) ed(空遞增堆疊)
4) fa(滿遞增堆疊)
ldm ldmiar0,按照多暫存器讀取
例子: mov r1,0xf
ldmiar1,
結果是將r1的暫存器中的記憶體位址給r2,r2的記憶體位址減4給r3,r3的記憶體位址減4給r4
stm stmia r0,按照多暫存器寫入
例子 mov r1,0x4
stmiar1,
結果是將r1的暫存器的位址開始重新寫入r2-r4新的記憶體值
資料交換操作分為:
swp rn,r1,[rn2] 記憶體和暫存器之間交換
例子 mov r1,#0x0f
mov r2,#0x12
swp r0,r1,[r2]
結果將r2的0x12給r0,接著將r1的0x0f寫入到r2的記憶體中去
跳轉指令分為:
bl 帶返回鏈結跳轉指令
area hello,code,readonly
entry
start
bstrom
movr1,#0x0f
movr2,#0x12
swpr0,r1,[r2]
movr1,#0x4
stmiar1,
seond
ldrbr0,[r1]
movpc,lr
strom
blseond
strr1,[r0,#0x0c]
end
mrs 把程式狀態暫存器值傳送到通用暫存器裡
第6章 實戰之聊天語料處理
學習 extract conv.py檔案 函式1 def make split line if re.match r join line return return 首先,定義函式 make split 其主要實現功能是匹配開頭為.的字串,若有這些字串,將其用空格 表示。用空格 代替來連線line中...
第 6章 函式
6.1.2引數 2.引數陣列 c 允許為函式指定乙個 只能乙個 特殊的引數,這個引數必須是函式定義中的最後乙個引數,可用params關鍵字定義他們 如 params int vals 3.引用引數和值引數 理解 將本來在函式中引數按值引用的規則改變成按傳遞引用,使得這個引數會改變,定義引數和傳遞引數...
第6章 函式
1.自動物件 只存在於塊執行期間的物件 2.區域性靜態物件static 在程式執行路徑第一次經過物件定義語句時初始化,並且知道程式終止才被銷毀,如果區域性靜態變數沒有顯示的初始值,初始化為0.3.如果函式無須改變引用形參的值,最好將其生命為常量引用。4.使用引用形參返回額外資訊 5.和其他初始化過程...