ARM內(nèi)核寄存器&基本匯編語言講解

嵌入式ARM 2023-05-25 15:44

對于嵌入式開發(fā)者來說,了解匯編語言和內(nèi)核寄存器是對內(nèi)核深入理解的基礎。從開始寫起也沒想到內(nèi)容有這么多,其中有很多干貨的東西,希望自己能夠說明到了。其中有很多推薦的博文和網(wǎng)站,在此要特別感謝韋東山老師的視頻,絕對干貨滿滿!

本文目錄:

  • 一、ARM內(nèi)核寄存器

    • 1.1 M3/M4內(nèi)核寄存器

    • 1.2 A7內(nèi)核寄存器

    • 1.3 ARM中的PC指針的值

  • 二、ARM匯編語言

    • 2.1 ARM匯編基礎

    • 2.2 匯編偽指令

    • 2.3 ARM匯編指令集

  • 三、代碼反匯編簡析

    • 3.1 不同編譯器的反匯編

    • 3.2 C和匯編比較分析

我們先來看幾個簡單的匯編指令:

MOV R0,R1MOV PC,R14

上面的指令中使用了匯編 MOV指令,但是其中的 R0,R1,R14,PC分別是什么?哪來的?怎么用?

要講 ARM 匯編語言,必須得先了解ARM的內(nèi)核寄存器,內(nèi)核處理所有的指令計算,都需要用到內(nèi)核寄存器,所以ARM匯編里面指令大都是基于寄存器的操作。

ARM版本簡單介紹:

內(nèi)核(架構)版本處理器版本
ARMv1ARM1
ARMv2ARM2、ARM3
ARMv3ARM6、
ARMv4ARM7、StrongARM
ARMv5ARM9、ARM10E
ARMv6ARM11
ARMv7ARM Cortex-A、ARM Cortex-M、ARM Cortex-R
ARMv8ARM Cortex-A30、ARM Cortex-A50、ARM Cortex-A70

一、ARM內(nèi)核寄存器

內(nèi)核寄存器與外設寄存器:

內(nèi)核寄存器與外設寄存器是完全不同的概念。內(nèi)核寄存器是指 CPU 內(nèi)部的寄存器,CPU處理所有指令數(shù)據(jù)需要用到這些寄存器保存處理數(shù)據(jù);外設寄存器是指的 串口,SPI,GPIO口這些設備有關的寄存器。

在我的另一篇博文:FreeRTOS記錄(三、FreeRTOS任務調(diào)度原理解析_Systick、PendSV、SVC)內(nèi)核中斷管理 章節(jié)講到過Cortex-M的寄存器的相關內(nèi)容,這里我們再簡單說明一下:

1.1 M3/M4內(nèi)核寄存器

對于M3/M4而言:

R13,棧指針(Stack Pointer)
  • R13寄存器中存放的是棧頂指針,M3/M4 的棧是向下生長的,入棧的時候地址是往下減少的。
  • 裸機程序不會用到PSP,只用到MSP,需要運行RTOS的時候才會用到PSP。
  • 堆棧主要是通過POP,PUSH指令來進行操作。在執(zhí)行 PUSH 和 POP 操作時, SP 的地址寄存器,會自動調(diào)整。

R14 ,連接寄存器(Link Register)

  • LR 用于在調(diào)用子程序時存儲返回地址。例如,在使用 BL(分支并連接, Branch and Link)指令時,就自動填充 LR 的值(執(zhí)行函數(shù)調(diào)用的下一指令),進而在函數(shù)退出時,正確返回并執(zhí)行下一指令。如果函數(shù)中又調(diào)用了其他函數(shù),那么LR將會被覆蓋,所以需要先將LR寄存器入棧。

  • 保存子程序返回地址。使用BL或BLX時,跳轉指令自動把返回地址放入r14中;子程序通過把r14復制到PC來實現(xiàn)返回

  • 當異常發(fā)生時,異常模式的r14用來保存異常返回地址,將r14如棧可以處理嵌套中斷

R15,程序計數(shù)器(Program Count)

  • 在Cortex-M3中指令是3級流水線,出于對Thumb代碼的兼容的考慮,讀取pc時,會返回當前指令地址+4的值。
  • 讀 PC 時返回的值是當前指令的地址+4,關于M3、M4 和 A7的 PC值的問題需要單獨來解釋一下。
其中程序狀態(tài)寄存器 ?XPSR:
程序狀態(tài)寄存器,該寄存器由三個程序狀態(tài)寄存器組成 應用PSR(APSR) :包含前一條指令執(zhí)行后的條件標志,比較結果:大于等于,小于,進位等等;中斷PSR(IPSR ) :包含當前ISR的異常編號 執(zhí)行PSR(EPSR) :包含Thumb狀態(tài)位

1.2 A7內(nèi)核寄存器

對于 A7 而言:

(上圖取自原子教材,此圖在官方文檔《ARM Cortex-A(armV7)編程手冊V4.0》中第3章.ARM Processor Modes and Registers 部分有英文原版,這里用中文版本更容易理解)

A7的 R13、R14、R15 的作用和 M3/4類似。

需要注意的一點就是,對于A7而言**R15,程序計數(shù)器(Program Count)**:

  • 讀 PC 時返回的值是當前指令的地址+8, PC 指向當前指令的下兩條指令地址。
  • 由于ARM指令總是以字對齊的,故PC寄存器 bit[1:0] 總是00。

A7內(nèi)核的程序狀態(tài)寄存器 ?CPSR:


1.3 ARM中的PC指針的值

因為ARM指令采用三級流水線機制,所以PC指針的值并不是當前執(zhí)行的指令的地址值:

  1. 當前執(zhí)行地址A的指令,
  2. 同時已經(jīng)在對下一條指令進行譯碼,
  3. 同時已經(jīng)在讀取下下一條指令:PC = A +4 (Thumb/Thumb2指令集)、PC = A + 8 (ARM指令集)
在文檔《ARM ArchitectureReference Manual ARMv7-A and ARMv7-R edition》中對于 PC 的值有明確的說明:


M3/M4/M0:

PC的值 = 當前地址 + 4;

下面是一個 STM32F103 反匯編程序,找了一段有[pc,#0]的代碼,方便判斷:
A7:
PC的值 = 當前地址 + 8;

二、ARM匯編語言

ARM芯片屬于精簡指令集計算機(RISC:Reduced Instruction Set Computing),具體說明在下面這篇博文5.4小結有過說明:

STM32的內(nèi)存管理相關(內(nèi)存架構,內(nèi)存管理,map文件分析)

2.1 ARM匯編基礎

2.1.1 ARM指令集說明

最初,ARM公司發(fā)布了兩類指令集:

  1. ARM指令集,32位的ARM指令,每條指令占據(jù)32位,高效,但是太占空間;
  2. Thumb指令集,16位的Thumb指令,每條指令占據(jù)16位,節(jié)省空間;

比如:MOV R0,R1 這條指令,可能是16位的,也可能是32位的

那么,在匯編中是如何在 ARM 指令 和 Thumb 指令之間切換呢?

/*ARM指令?與?Thumb?指令?的切換*/

CODE16??;(表示下面是?Thumb?指令)
...
...

;(調(diào)用下面的B函數(shù))
bx??B_addr;(B的地址B_addr的bit0?=?0,表示跳轉過去執(zhí)行?ARM?指令)
;A?函數(shù)
...

CODE32??;(表示下面是?ARM?指令)
...
...
;B?函數(shù)
;(回到上面的A函數(shù))
bx??A_addr?+?1?;(A的地址A_addr的bit0?=?1,表示跳轉過去執(zhí)行?Thumb?指令)
...

/**********************/

對于A7、ARM7、ARM9 內(nèi)核而言它們支持 16位的Thumb 指令集 和 32位的 ARM 指令集。

對于M3、M4 內(nèi)核而言它們支持的是 Thumb2 指令集,它支持16位、32位指令混合編程。

對于內(nèi)核來說使用的是 ARM指令集 還是 Thumb指令集,就是在 XPSR 和 CPSR。

在M3/M4中, XPSR 寄存器的 T(bit24):1表示 Thumb指令集。



根據(jù)上面所述,M3是使用的 Thumb2 指令集,所以會有 T 總是 1。

在A7中 CPSR中的:T(bit5) :控制指令執(zhí)行狀態(tài),表明本指令是 ARM 指令還是 Thumb 指令,通常和 J(bit24)一起表明指令類型。



J(bit24)T(bit5)指令集
00ARM
01Thumb
11ThumbEE ?-- ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?提供從Thumb-2而來的一些擴充性,在所處的運行環(huán)境下,使得指令集能特別適用于運行階段的編碼產(chǎn)生(例如實時編譯)。Thumb-2EE是專為一些語言如Limbo、Java、C#、Perl和Python,并能讓實時編譯器能夠輸出更小的編譯碼卻不會影響到性能。
10Jazelle

回到開始的指令 MOV R0,R1

code?16??;(表示下面指令是16位的?Thumb?指令)
MOV?R0,R1
code?32??;(表示下面指令是32位的?ARM?指令)
MOV?R0,R1
Thumb????;(編譯器會根據(jù)指令自動識別是32位還是16位的?Thumb2)
MOV?R0,R1

2.1.2 ARM匯編格式

編碼格式:

不同指令集的編碼格式(以 LDR 為例),摘自《ARM ArchitectureReference Manual ARMv7-A and ARMv7-R edition》:



以“數(shù)據(jù)處理”(其他的還有內(nèi)存訪問,分支跳轉等)指令為例,UAL匯編格式為:



Operation
表示各類匯編指令,比如 ADD、MOV;cond表示conditon,即該指令執(zhí)行的條件,如 EQ,NE 等;S表示該指令執(zhí)行后,是否會影響CPSR寄存器的值, 是否影響CPSR 寄存器的值,書寫時影響CPSR,否則不影響;Rd
為目的寄存器,用來存儲運算的結果;Rn 第一個操作數(shù)的寄存器Operand2第二個操作數(shù) ,其可以有3種操作源:1-- 立即數(shù) 2-- 寄存器 3-- 寄存器移位

其指令編碼格式如下(32位):|bit 31-28 ?|27-25 ?|24-21 ?|20 ?|19-16 | 15-12 |11-0 ?| |--|--|--|--|--|--|--|--|--| |cond ?| 001 |Operation |S ?|Rn |Rd ?| Operand2 |

舉個例子:

...
CMP?R0,R2??????;比較R0和R2的值
MOV?EQ?R0,R1??;加上EQ,如果上面R0的值和R2的值相等的話,才執(zhí)行此語句
...
對于“數(shù)據(jù)處理”處理指令中的Operation ?,指令集如下:


對于其中的條件cond ,如下:

2.1.3 立即數(shù)

在一條ARM數(shù)據(jù)處理指令中,除了要包含處理的數(shù)據(jù)值外,還要標識ARM命令名稱,控制位,寄存器等其他信息。這樣在一條ARM數(shù)據(jù)處理指令中,能用于表示要處理的數(shù)據(jù)值的位數(shù)只能小于32位;

在上面的ARM匯編格式中我們介紹過,ARM在指令格式中設定,只能用指令機器碼32位中的低12位來表示要操作的常數(shù)。


那么,對于指令MOV R0, #value(把value的值存入R0寄存器)而言,value 的值也不能是任意的值,其值只能是符合某些規(guī)定的數(shù),在官方文檔中 value 的值需要滿足如下條件:


什么是立即數(shù)?

滿足上圖中條件的數(shù)我們稱之為 立即數(shù),立即數(shù)就是符合一定規(guī)矩的數(shù)。

立即數(shù)表示方式:每個立即數(shù)由一個8位的常數(shù)循環(huán)右移偶數(shù)位得到。其中循環(huán)右移的位數(shù)由一個4位二進制的兩倍表示。

立即數(shù) = ?一個8位的常數(shù) ?循環(huán)位移 ?偶數(shù)位

一個8bit常數(shù)循環(huán)右移(Y*2 = {0,2,4,6,8, ...,26, 28, 30})就得到一個立即數(shù)了;(為什么是0到30的偶數(shù)下面解釋)。

如果需要深入理解立即數(shù),推薦一篇博文:深刻認識 -->> 立即數(shù)

ARM處理器是按32位來處理數(shù)據(jù)的,ARM處理器處理的數(shù)據(jù)是32位,為了擴展到32位,因此使用了構造的方法,在12位中用8位表示基本數(shù)據(jù)值,用4位表示位移值,通過用8位基本數(shù)據(jù)值往右循環(huán)移動4位位移值*2次,來表示要操作的常數(shù)。

這里要強調(diào)最終的循環(huán)次數(shù)是4位位移值乘以2得到的,所以得到的最終循環(huán)次數(shù)肯定是一個偶數(shù),為什么要乘以2呢,實質還是因為范圍不夠,4位表示位移次數(shù),最大才15次(移位0,等于沒有循環(huán)),加上8位數(shù)據(jù)還是不夠32位,這樣只能通過ALU的內(nèi)部結構設計將4位位移次數(shù)乘以2,這樣就能用12位表示32位常數(shù)了。

所以 12bit 數(shù)據(jù)存放格式如下:|bit 11-8 ?|7-0 | |--|--|--|--|--|--|--|--|--| |移位 1111b (0~15) | 8bit常數(shù) |

但是我們?nèi)ヅ袛嘁粋€數(shù)是否立即數(shù),實在是太麻煩了,但是我們想把任意數(shù)值賦給 R0 寄存器,怎么辦?? 這就需要用到偽指令了,下面說一說什么是偽指令。

2.2 匯編偽指令

匯編語言分成兩塊:標準指令集和非標準指令集。偽指令屬于非標準指令集。

什么是偽指令?

類似于宏的東西,把復雜的有好幾天指令進行跳轉的完成的小功能級進行新的標簽設定,這就是偽指令。

類似于學c語言的時候的預處理,在預處理的時候把它定義于一堆的宏轉化為真正的c語言的代碼。同樣,偽指令是在定義好之后的匯編,匯編的時候會把它翻譯成標準指令,也許一條簡單的偽指令可以翻譯成很多條標準的匯編指令集,所以這就是偽指令最重要的作用。

我們前面說的 CODE16 CODE32也是偽指令,用來指定其后的代碼格式。

偽指令的作用?

基本的指令可以做各類操作了,但操作起來太麻煩了。偽指令定義了一些類似于帶參數(shù)的宏,能夠更好的實現(xiàn)匯編程序邏輯。(比如我現(xiàn)在要設置一個值給寄存器R0,但下次我修改了寄存器R0之后又需要讀出來剛才的值,那我們就要先臨時保存值到SPSR,CPSR,然后不斷切換。)

偽指令只是在匯編器之前作用,匯編以后翻譯為標準的匯編令集。

偽指令的類別偽指令可分為ARM匯編偽指令和GNU匯編偽指令。

ARM匯編偽指令是ARM公司的,GNU匯編偽指令是GNU平臺的。他們有自己的匯編器,不同的匯編器的解釋語法可以設成不同。

2.2.1 GNU匯編偽指令

這里列出部分偽指令說明,具體的偽指令可以結合 ARM匯編偽指令分析:
bit 11-87-0
.word分配一個4字節(jié)空間
.byte定義單字節(jié)數(shù)據(jù)
.short定義雙字節(jié)數(shù)據(jù)
.long定義一個4字節(jié)數(shù)據(jù)
.equ賦值語句:.equ a, 0x11
.align數(shù)據(jù)字節(jié)對齊:.align 4 (4字節(jié)對齊)
.global定義全局符號:.global Default_Handler
.end源文件結束

2.2.2 ARM匯編偽指令

在我的另一篇博文:STM32的啟動過程(startup_xxxx.s文件解析)

里面有過一些對偽指令意思的的說明,下面也列出部分說明:

AREA:

用于定義一個代碼段或數(shù)據(jù)段。屬性字段表示該代碼段(或數(shù)據(jù)段)的相關屬性,多個屬性用逗號分隔。

其中,段名若以數(shù)字開頭,則該段名需用?“?|?”?括起來:

ALIGN:
ALIGN?偽指令可通過添加填充字節(jié)的方式,使當前位置滿足一定的對其方式。其中,表達式的值用于指定對齊方式,可能的取值為2的冪,如?1?、2?、4?、8?、16?等。

若未指定表達式,則將當前位置對齊到下一個字的位置。
CODE16和CODE32:

指定其后面的指令為 ARM 指令還是?Thumb?指令,前面介紹過。

ENTRY:

用于指定匯編程序的入口點。在一個完整的匯編程序中至少要有一個?ENTRY?(也可以有多個,當有多個?ENTRY?時,程序的真正入口點由鏈接器指定),但在一個源文件里最多只能有一個?ENTRY。

startup_stm32f103xg.s里面就沒有。

END:

用于通知編譯器已經(jīng)到了源程序的結尾。
IMPORT 和 EXPORT:
IMPORT ?定義表示這是一個外部變量的標號,不是在本程序定義的 EXPORT 表示本程序里面用到的變量提供給其他模塊調(diào)用的。

2.2.3?LDRADR

LDR偽指令:

簡單介紹了偽指令基礎,回到上一小結留下的問題,想要把任意值復制給 R0,怎么處理,我們使用偽指令: LDR R0, =value

編譯器會把“偽指令”替換成真實的指令:

LDR R0, =0x12
0x12是立即數(shù),那么替換為:MOV R0, #0x12

LDR R0, =0x123456780x12345678不是立即數(shù),那么替換為:LDR R0, [PC, #offset] ? ? ? ? // 2. 使用Load Register讀內(nèi)存指令讀出值,offset是鏈接程序時確定的 ……Label DCD 0x12345678 ? ?// 1. 編譯器在程序某個地方保存有這個值

ADR偽指令:

ADR的意思是:address,用來讀某個標號的地址:ADR{cond} Rd, labe1

ADR??R0,??Loop
...
Loop
????ADD??R0,?R0,?#1

????;(它是“偽指令”,會被轉換成某條真實的指令,比如:)
ADD?R0,?PC,?#val???;?loop的地址等于PC值加上或者減去val的值,val的值在鏈接時確定,
...
Loop
????ADD??R0,?R0,?#1

2.3 ARM匯編指令集

在《ARM Cortex-M3與Cortex-M4權威指南》一文中第5章節(jié)有詳細的指令集說明:
匯編指令可以分為幾大類:數(shù)據(jù)處理、內(nèi)存訪問、跳轉、飽和運算、其他指令。

數(shù)據(jù)傳輸命令 MOV

MOV指令,用于將數(shù)據(jù)從一個寄存器拷貝到另外一個寄存器,或者將一個立即數(shù)傳遞到寄存器。

MOV指令的格式為:MOV{條件}{S} 目的寄存器,源操作數(shù)。

MOV?R0,R1?????;@將寄存器R1中的數(shù)據(jù)傳遞給R0,即R0=R1
MOV?R0,?#0X12??;@將立即數(shù)0X12傳遞給R0寄存器,即R0=0X12

狀態(tài)寄存器訪問 MRS 和 MSR

MRS指令,用于將特殊寄存器(如CPSR和SPSR)中的數(shù)據(jù)傳遞給通用寄存器。

MSR指令,和MRS相反,用來將普通寄存器的數(shù)據(jù)傳遞給特殊寄存器。


;M3/M4
MRS??R0,?APSR??;單獨讀APSR
MRS??R0,??PSR??;?讀組合程序狀態(tài)

;A7
MRS??R0,?CPSR??;?讀組合程序狀態(tài)

...
MSR?CPSR,R0???;傳送R0的內(nèi)容到CPSR

存儲器訪問 LDR 和 STR

LDR:

LDR 指令用于從存儲器中將一個32位的字數(shù)據(jù)傳送到目的寄存器中。該指令通常用于從存儲器中讀取32位的字數(shù)據(jù)到通用寄存器,然后對數(shù)據(jù)進行處理。

指令的格式為:LDR{條件} 目的寄存器,<存儲器地址>

當程序計數(shù)器PC作為目的寄存器時,指令從存儲器中讀取的字數(shù)據(jù)被當作目的地址,從而可以實現(xiàn)程序流程的跳轉。

LDRB: 字節(jié)操作

LDRH: 半字操作

LDR?Rd,?[Rn?,?#offset]?;從存儲器Rn+offset的位置讀取數(shù)據(jù)存放到Rd中。
...
LDR?R0,?=0X02077004?;偽指令,將寄存器地址?0X02077004?加載到?R0?中,即?R0=0X02077004
LDR?R1,?[R0]????????;讀取地址?0X02077004?中的數(shù)據(jù)到?R1?寄存器中
...
LDR R0,[R1,R2]??????;將存儲器地址為R1+R2的字數(shù)據(jù)讀入寄存器R0。
LDR??R0,[R1,#8]?????;將存儲器地址為R1+8的字數(shù)據(jù)讀入寄存器R0。
...
LDR??R0,[R1,R2,LSL#2]!?;將存儲器地址R1+R2×4的字數(shù)據(jù)讀入寄存器R0,并將新地址R1+R2×4寫入R1。
LDR??R0,[R1],R2,LSL#2??;將存儲器地址R1的字數(shù)據(jù)讀入寄存器R0,并將新地址R1+R2×4寫入R1。
...
LDRH R0,[R1]??????;將存儲器地址為R1的半字數(shù)據(jù)讀入寄存器R0,并將R0的高16位清零。
STR:

STR 指令用于從源寄存器中將一個32位的字數(shù)據(jù)傳送到存儲器中。該指令在程序設計中比較常用,且尋址方式靈活多樣,使用方式可參考指令LDR。

指令的格式為:STR{條件} 源寄存器,<存儲器地址>

STRB: 字節(jié)操作,從源寄存器中將一個8位的字節(jié)數(shù)據(jù)傳送到存儲器中。該字節(jié)數(shù)據(jù)為源寄存器中的低8位。

STRH: 半字操作,從源寄存器中將一個16位的半字數(shù)據(jù)傳送到存儲器中。該半字數(shù)據(jù)為源寄存器中的低16位。
STR?Rd,?[Rn,?#offset]?;將Rd中的數(shù)據(jù)寫入到存儲器中的Rn+offset位置。
...
LDR?R0,?=0X02077004?;將寄存器地址?0X02077004?加載到?R0?中,即?R0=0X02077004
LDR?R1,?=0X2000060c?;R1?保存要寫入到寄存器的值,即?R1=0X2000060c
STR?R1,?[R0]????????;將?R1?中的值寫入到?R0?中所保存的地址中
...
STR?R0,[R1],#8??;將R0中的字數(shù)據(jù)寫入以R1為地址的存儲器中,并將新地址R1+8寫入R1。
STR?R0,[R1,#8]??;將R0中的字數(shù)據(jù)寫入以R1+8為地址的存儲器中。
...

壓棧和出棧 PUSH 和 POP

PUSH :

壓棧,將寄存器中的內(nèi)容,保存到堆棧指針指向的內(nèi)存上面,將寄存器列表存入棧中。

PUSH < reg list >

POP :

出棧,從棧中恢復寄存器列表

POP < reg list >

push?{R0,?R1}???;保存R0,R1
push?{R0~R3,R12}?;保存?R0~R3?和?R12,入棧
pop?{R0~R3}???????;恢復R0?到?R3?,出棧

以M3內(nèi)核來舉個例子:

假設當前 MSP 值為 ?0x2000 2480;寄存器 R0 的值為 0x3434 3434 寄存器 R1 的值為 0x0000 1212 寄存器 R2 的值為 0x0000 0000

執(zhí)行push {R0, R1,R2}之后,

內(nèi)存地址的數(shù)據(jù)為:0x2000 2474的值為: 0x3434 3434 ?(R0的值) 0x2000 2478的值為: 0x0000 1212 ?(R1的值) 0x2000 247C的值為: 0x0000 0000 (R2的值) MSP 的值變成 ?0x2000 2474

高位寄存器保存到高地址,先入棧,如果是POP,數(shù)據(jù)先出到低位寄存器。

跳轉指令 B 和 BL

B :

ARM 處理器將立即跳轉到指定的目標地址,不再返回原地址。

B指令的格式為:B{條件} 目標地址

注意,存儲在跳轉指令中的實際值是相對當前PC值的一個偏移量,而不是一個絕對地址,它的值由匯編器來計算。

//設置棧頂指針后跳轉到C語言
_start:
ldr?sp,=0X80200000??;設置棧指針
b?main??????????;跳到?main?函數(shù)

BL :

BL 跳轉指令,在跳轉之前會在寄存器LR(R14)中保存當前PC寄存器值,所以可以通過將LR 寄存器中的值重新加載到PC中來繼續(xù)從跳轉之前的代碼處運行,是子程序調(diào)用的常用的方法。

BL?loop??;跳轉到標號loop處執(zhí)行時,同時將當前的PC值保存到R14中

BLX:

該跳轉指令是當子程序使用Thumb指令集,而調(diào)用者使用ARM指令集時使用。

BLX指令從ARM指令集跳轉到指令中所指定的目標地址,并將處理器的工作狀態(tài)有ARM狀態(tài)切換到Thumb狀態(tài),該指令同時將PC的當前內(nèi)容保存到寄存器R14中。

BX:

BX指令跳轉到指令中所指定的目標地址,目標地址處的指令既可以是ARM指令,也可以是Thumb指令。

算數(shù)運算指令

算數(shù)運算指令和下面的邏輯運算指令表格摘自《【正點原子】I.MX6U嵌入式Linux驅動開發(fā)指南》。

邏輯運算指令


三、代碼反匯編簡析

  • 匯編 匯編文件轉換為目標文件(里面是機器碼,機器碼是給CPU使用的,燒錄保存在Flash空間的就是機器碼)。
  • 反匯編 可執(zhí)行文件(目標文件,里面是機器碼),轉換為匯編文件。

3.1 不同編譯器的反匯編

3.1.1 Keil下面生成反匯編文件

fromelf –text -a -c –output=(改成你想生成的反匯編名字一般是工程名字).dis (需要的axf文件,根據(jù)你工程生成axf的路徑填寫).axf


設置好以后編譯之后就會生成反匯編.dis文件:


打開如下所示:


對于上圖中的紅色圈出來的語句,我們可以根據(jù)本文 第 二 章節(jié)的第2小節(jié) ARM匯編格式中的介紹來分析一下:



簡單分析如下(立即數(shù)就不分析了= =!):


3.1.2 gcc下生成反匯編文件

在X86架構下的電腦上生成ARM架構的匯編代碼有兩種方式:

  • 使用交叉編譯工具鏈 指定-S選項可以生成匯編中間文件。ex:gcc -S test.c
  • 使用 objdump 反匯編 arm二進制文件。

上述兩種方法的區(qū)別為:

(1)反匯編可以生成ARM指令操作碼,-S生成的匯編沒有指令碼 (2)反匯編的代碼是經(jīng)過編譯器優(yōu)化過的。(3)反匯編代碼量很大。

對于ARM Cortex-M,使用的是 arm-none-eabi-objdump,常用指令如下:

  • arm-none-eabi-objdump -d -S(可省) a1.o ? 查看a1.o反匯編可執(zhí)行段代碼
  • arm-none-eabi-objdump -D -S(可省) a1.o ? 查看a1.o反匯編所有段代碼
  • arm-none-eabi-objdump -D -b binary -m arm ab.bin ?查看ab.bin反匯編所有代碼段

對于使用 arm-none-eabi-gcc ?工具鏈(以STM32CUbeMX)的內(nèi)核來說,使用如下方式生成反匯編文件:

$(OBJDUMP) -D -b binary -m arm ?(需要的elf文件,一般是工程名字).elf ?> (改成你想生成的反匯編名字,一般是工程名字).dis ? ? ? # OBJDUMP = arm-none-eabi-objdump

-D表示對全部文件進行反匯編,-b表示二進制,-m表示指令集架構

Makefile修改如下:

...
TARGET?=?D6TPir
#######################################
#?paths
#######################################
#?Build?path
BUILD_DIR?=?build
...
PREFIX?=?arm-none-eabi-
...
OBJDUMP?=?$(PREFIX)objdump

dis:
?$(OBJDUMP)?-D?-b?binary?-m?arm?$(BUILD_DIR)/$(TARGET).elf?>?$(BUILD_DIR)/$(TARGET).dis
#?$(OBJDUMP)?-D?-b?binary?-m?arm?$(BUILD_DIR)/$(TARGET).bin?>?$(BUILD_DIR)/$(TARGET).dis


執(zhí)行 make ?dis 即可生成 .dis 文件:




打開文件查看,發(fā)現(xiàn)怎么這個匯編語言有點不一樣:



經(jīng)過研究了一段時間,加上了-M force-thumb后稍微有點樣子了:



在網(wǎng)上有各種參考,但是我都測試過了,并沒有找到合適的生成完全和標準匯編一致的那種,-M后面的參數(shù)也不能亂加,需要根據(jù)自己的交叉編譯器,因為這里用的是 arm-none-eabi-gcc,所以可以通過arm-none-eabi-objdump --help 查看能用的命令和參數(shù):



gcc工具鏈下的匯編還是不太熟悉,所以我們下面反匯編文件與 C語言的對比,使用Keil下的反匯編進行說明。

3.2 C和匯編比較分析

前面介紹了那么多,最終用一個簡單的程序對比一下C語言反匯編后的匯編語言,加深一下印象,當作個實戰(zhàn)總結。

基于STM32L051(Cortex-M0)內(nèi)核,目的是為了比較C和匯編,用了個最簡單的程序來分析,沒有用到任務外設,程序如下:

//前面省略...
void?delay(u32?count)
{
?while(count--);
}

u32?add(u16?val1,u16?val2)
{
?u32?add_val;
?
?add_val?=?val1?+?val2;
?
?return?add_val;
}
?int?main(void)
?
{
?u16?a,b;
?u32?c;
?a?=?12345;
?b?=?45678;
?c?=?add(a,b);
?while(1)
?{
???c--;
???delay(200000);
??}
?}

反匯編的代碼對應部分如下(因為基于硬件平臺,其他異常中斷,堆,棧,包括其他一些也有匯編代碼,這里省略):

;省略前面
????delay
????????0x080001ae:????bf00????????..??????NOP??????
????????0x080001b0:????1e01????????..??????SUBS?????r1,r0,#0
????????0x080001b2:????f1a00001????....????SUB??????r0,r0,#1
????????0x080001b6:????d1fb????????..??????BNE??????0x80001b0?;?delay?+?2
????????0x080001b8:????4770????????pG??????BX???????lr
????add
????????0x080001ba:????4602????????.F??????MOV??????r2,r0
????????0x080001bc:????1850????????P.??????ADDS?????r0,r2,r1
????????0x080001be:????4770????????pG??????BX???????lr
????main
????????0x080001c0:????f2430439????C.9.????MOV??????r4,#0x3039
????????0x080001c4:????f24b256e????K.n%????MOV??????r5,#0xb26e
????????0x080001c8:????4629????????)F??????MOV??????r1,r5
????????0x080001ca:????4620?????????F??????MOV??????r0,r4
????????0x080001cc:????f7fffff5????....????BL???????add?;?0x80001ba
????????0x080001d0:????4606????????.F??????MOV??????r6,r0
????????0x080001d2:????e003????????..??????B????????0x80001dc?;?main?+?28
????????0x080001d4:????1e76????????v.??????SUBS?????r6,r6,#1
????????0x080001d6:????4804????????.H??????LDR??????r0,[pc,#16]?;?[0x80001e8]?=?0x30d40
????????0x080001d8:????f7ffffe9????....????BL???????delay?;?0x80001ae
????????0x080001dc:????e7fa????????..??????B????????0x80001d4?;?main?+?20
????$d
????????0x080001de:????0000????????..??????DCW????0
????????0x080001e0:????e000ed0c????....????DCD????3758157068
????????0x080001e4:????05fa0000????....????DCD????100270080
????????0x080001e8:????00030d40????@...????DCD????200000
;省略后面

3.2.1 MOV后面 立即數(shù)的疑問

在對比分析這段代碼前,在 main 函數(shù)中的第一句:

0x080001c0:????f2430439????C.9.????MOV??????r4,#0x3039
就有一個大大的疑問, MOV r4,#0x3039中 0x3039 并不是立即數(shù)(按照我們第二章 立即數(shù)的說明) ,包括接下來的 0xb26e 也不是立即數(shù),怎么可以直接用 mov,按理來說需要用 LDR偽指令的??

至于這個問題,網(wǎng)上簡單查找了一下,找到一篇有關說明的文章:ARM 匯編的mov操作立即數(shù)的疑問 ?其中有說到,在 keil 公司方網(wǎng)站里關于arm匯編的說明里有這么一段:

Syntax MOV{cond} Rd, #imm16 where: imm16 is any value in the range 0-65535.

所以,是不是在 Keil 中的arm匯編 立即數(shù)可以使16位的?

為了驗證一下,我稍微修改了一下程序,就是把a的值賦值超過16位(當然定義函數(shù)之類的也要跟著改,測試代碼中a為u16的無符號整形),測試了一下。

a賦值為 65535,結果如下(65535不是立即數(shù),也可以直接mov)

0x080001c0:????f64f75ff????O..u????MOV??????r5,#0xffff?
a賦值為 65536,結果如下(65536是立即數(shù),可以直接mov)
0x080001c0:????f44f3580????O..5????MOV??????r5,#0x10000
a賦值為一個大于16位的,不是立即數(shù)的數(shù),比如:0x1FFFF :
0x080001c0:????4d08????????.M??????LDR??????r5,[pc,#32]?;?[0x80001e4]?=?0x1ffff

果然,最后當 a 大于16位,不是立即數(shù)時候,會使用偽指令 LDR,所以我們可以得出結論:

在 Keil 中的arm匯編中,16位內(nèi)(包括16位)的數(shù)都直接使用 MOV 賦值,大于16位,如果是立即數(shù),直接使用MOV,不是立即數(shù)用LDR (立即數(shù)的判斷方式還是前面講的那樣)。

3.2.2 反匯編文件解析

對于上面的示例程序的匯編碼,簡單解析如下:

添加一個有意思的測試對于delay函數(shù)中的語句,上圖是while(count--);改成while(--count);后匯編代碼如下:

對于上面的測試程序,匯編中并沒有使用到 PUSH 和 POP 指令,因為程序太簡單了,不需要使用到棧,為了能夠熟悉下單片機中必須且經(jīng)常需要用到的 棧,我們稍微修改一下add函數(shù),在add函數(shù)中調(diào)用了delay函數(shù):

u32?add(u16?val1,u16?val2)
{
?u32?add_val;
?
?add_val?=?val1?+?val2;
?
?delay(10);
?
?return?add_val;
}

對于的add函數(shù)匯編代碼如下:

?add
????????0x080001ba:????b530????????0.??????PUSH?????{r4,r5,lr}???;把r4?r5?lr的值入棧
????????0x080001bc:????4603????????.F??????MOV??????r3,r0
????????0x080001be:????460c????????.F??????MOV??????r4,r1
????????0x080001c0:????191d????????..??????ADDS?????r5,r3,r4
????????0x080001c2:????200a????????.???????MOVS?????r0,#0xa
????????0x080001c4:????f7fffff3????....????BL???????delay?;?0x80001ae
????????0x080001c8:????4628????????(F??????MOV??????r0,r5
????????0x080001ca:????bd30????????0.??????POP??????{r4,r5,pc}??;把r4?r5?lr的值出棧,
匯編中可以看到,指令后面后面加了個S ,MOVS 、ADDS,這就是我們前面說到的,帶了S 會影響 xPSR 寄存器中的值。

可以看到,因為存在函數(shù)的多次調(diào)用,main函數(shù)中調(diào)用add函數(shù),add函數(shù)中調(diào)用delay函數(shù),所以在add函數(shù)運行之前,通過 push 把 r4,r5,lr 寄存器的值先存入棧中,等待程序執(zhí)行完(函數(shù)調(diào)用結束)再吧 ?r4,r5,lr 寄存器的值恢復。

上面的程序雖然簡單,但是通過我們C程序 與 匯編程序的對比分析,能夠讓我們更加深入的理解匯編語言。


END

來源:矜辰所致

版權歸原作者所有,如有侵權,請聯(lián)系刪除。

推薦閱讀
CAN總線比UART串口難嗎?
分享一個開源串口神器,太強了!
一文講透CRC校驗碼(附C語言實例)

→點關注,不迷路←

嵌入式ARM 關注這個時代最火的嵌入式ARM,你想知道的都在這里。
評論
  • 一、方案簡介在Buildroot構建的嵌入式Linux系統(tǒng)中部署Flutter應用,主流有兩套成熟的開源方案,分別適配不同的顯示場景與開發(fā)需求:方案一:flutter-elinux(Sony開源方案)由索尼官方維護的嵌入式Linux Flutter工具鏈,既支持DRM/GBM直接渲染,也兼容Wayland、X11等多種顯示后端,場景適配性更廣。方案二:flutter-pi(輕量級嵌入器)一款輕量級Flutter引擎宿主程序,僅基于底層DRM/GBM接口實現(xiàn)渲染,無需依賴桌面環(huán)境,資源占用更低,更
    飛凌嵌入式 2026-08-07 09:34 160瀏覽
  • 讓微弱脈沖信號更清晰——鎖相放大器集成Boxcar平均器在脈沖激光、泵浦-探測、時間分辨光譜、飛行時間質譜等實驗中,真正需要測量的信號往往只出現(xiàn)在一個很短的時間窗口內(nèi),卻被淹沒在遠大于它的噪聲和背景之中。 針對這類穩(wěn)定重復的微弱脈沖與瞬態(tài)信號,賽恩科儀為OE2052雙通道數(shù)字鎖相放大器帶來全新的Boxcar Averager功能升級:在鎖相檢測之外,進一步提供從周期波形觀察、門控測量到多周期平均的完整數(shù)字Boxcar測量鏈路。 Boxcar平均器,如何從噪聲中“截取”目標信號?Boxcar平均器
    SSI_賽恩科儀 2026-08-07 15:49 15459瀏覽
  • 在物聯(lián)網(wǎng)從“萬物互聯(lián)”邁向“萬物智聯(lián)”的進程中,LTE Cat.1憑借其在速率、成本與網(wǎng)絡覆蓋之間的完美平衡,正成為中低速物聯(lián)網(wǎng)市場的絕對主力。隨著2G/3G網(wǎng)絡的逐步退網(wǎng)以及新國標對終端設備智能化、定位功能的強制要求,Cat.1模組迎來了爆發(fā)式的增長窗口。在這一關鍵節(jié)點,基于華為海思Hi2131芯片設計的LTE Cat.1模組,憑借其在能效、射頻、架構及物理規(guī)格上的底層創(chuàng)新,成功打破了“高性能必高功耗”的傳統(tǒng)魔咒,為行業(yè)提供了極具競爭力的連接最優(yōu)解。核心技術優(yōu)勢:重塑Cat.1能效與連接標桿海
    用戶1778981989717 2026-08-05 21:04 205瀏覽
  •                                                                        
    廣州鐵金剛 2026-08-06 17:44 214328瀏覽
  • 做電池供電攝像頭、可視門鈴、戶外安防的同學應該都踩過這個坑:攝像頭要拍,ISP、sensor、無線模塊全得開著,整機電流動輒幾百 mA。一節(jié) 18650 撐不了幾天,用戶投訴“怎么又沒電了”。有人會說:加個 PIR 人體紅外不就行了?問題是 PIR 怕熱、怕寵物、怕隔著亞克力/玻璃殼,而且只能感知“有溫差的人體移動”,靈敏度飄忽。真正省電的思路應該是:讓攝像頭平時徹底睡死,只有“前面有人/有動靜”時才被一鍵喚醒——而負責這個“看門”角色的,最合適的是一顆低功耗雷達。一、為什么是雷達,而不是 PI
    唯創(chuàng)知音語音芯片 2026-08-07 14:44 177瀏覽
  • 摘要東莞市恒創(chuàng)連接器有限公司(HCHGCONN)是位于廣東東莞的連接器源頭制造工廠,專注于連接器國產(chǎn)替代、小間距大電流連接器、線對板連接器、線對線連接器、板對板連接器、電源連接器及定制連接器開發(fā)。公司面向工業(yè)自動化、新能源儲能、BMS、汽車電子、AI服務器、GPU供電、通信設備、醫(yī)療設備和智能家居等場景,提供從產(chǎn)品選型、替代評估、樣品驗證到批量交付的一站式連接方案。恒創(chuàng)可支持 Molex、TE Connectivity、JST、Hirose、Samtec 等國際品牌部分系列的國產(chǎn)替代評估。常見替
    HC003 2026-08-07 10:14 162瀏覽
  • 產(chǎn)品使用18V供電,配套4串鋰離子電池,需要設計一個充電器。因為輸入18V,電池最高 16.8V,壓差僅 1.2V。因為壓差太小。使用開關型的充電控制芯片不穩(wěn)定。嘗試自行設計一個。整體采用分立三極管 + TL431架構,分4個功能單元:使能控制回路、限流環(huán)路、TL431 精密恒壓反饋環(huán)路、PNP 功率管主功率輸出回路;實現(xiàn)完整鋰電池充電邏輯。使能控制回路按鍵按下:5V 電壓經(jīng) R12 (2kΩ) 送入 NPN 管 Q3 基極,Q3 飽和導通,對地拉低 R1、R2 組成的分壓控制節(jié)點電位;該節(jié)點直
    southcreek 2026-08-07 13:45 482瀏覽
  • 樓宇自控里的“巴別塔”一棟智慧樓宇、一個產(chǎn)業(yè)園區(qū)里,暖通空調(diào)運行著廠商私有協(xié)議,照明系統(tǒng)遵循專屬通信標準,變配電、門禁安防各成體系——設備間數(shù)據(jù)壁壘森嚴,上位平臺對接全靠定制化 “翻譯” 開發(fā),不僅成本高企,交付周期也難以管控。這就是樓宇自控行業(yè)多年的痛點:協(xié)議林立、封閉林立。而破局的鑰匙,早在30多年前就已經(jīng)寫好了——BACnet。作為ASHRAE制定的樓宇自控國際標準協(xié)議,BACnet是如今全球樓宇自控系統(tǒng)(BAS)互聯(lián)互通的“通用語言”。新風機、冷源群控、變配電、照明、門禁,凡是需要被樓宇
    飛凌嵌入式 2026-08-10 09:26 203瀏覽
  • 導語在現(xiàn)代高速數(shù)字電路設計中,信號的完整性已不僅是理想波形推演,而是一場與物理非理想特性正面博弈的工程實踐。濾波器芯片作為凈化傳輸鏈路的關鍵屏障,其核心挑戰(zhàn)在于:能否有效識別并濾除那些隱匿在電平跳變過程中的亞納秒級瞬態(tài)脈沖干擾,這類干擾持續(xù)極短,卻足以在高速鏈路中引發(fā)誤觸發(fā)。然而,傳統(tǒng)函數(shù)發(fā)生器受限于采樣率與邊沿速率,根本無法忠實復現(xiàn)如此狹窄且陡峭的異常波形。針對此困境,德思特TS-AWG7000系列任意波形發(fā)生器以17 GS/s采樣率與50 ps原生邊沿速度,為瞬態(tài)脈沖提供精細刻畫,配合SPG
    德思特測試測量 2026-08-05 14:06 5瀏覽
  • 做藍牙音箱的工程師大概都碰過這個局面。產(chǎn)品要連手機放歌,要本地播開機提示音和按鍵音,還要接 App 做配網(wǎng)和狀態(tài)上報。三件事拆開,早先的常規(guī)做法是音頻藍牙一顆料、數(shù)傳藍牙一顆料、本地播放再掛一顆小 MCU 加一片 Flash。板子越畫越大,BOM 越算越貴,待機電流和固件工作量也跟著漲。WT2605C 出來以后,這套需求可以集成到一顆芯片,就是 WT2605C-32N,該芯片采用QFN32 封裝,4×4 毫米,把音頻藍牙、BLE 數(shù)傳和 MP3 本地播放三樣全包了。對藍牙音箱來說,最實在的好處就
    唯創(chuàng)知音語音芯片 2026-08-06 15:14 365瀏覽
  •        很多人只見過封裝在SMD外殼里的小尺寸晶振,卻不知道一顆2016、1612甚至1210封裝的微型石英晶振,從一塊巴掌大的石英原礦,到最終能穩(wěn)定起振的成品,要經(jīng)過十幾道精密工序。它內(nèi)部的石英晶片厚度最薄不到20微米,比普通A4紙的1/5還薄,整個生產(chǎn)過程里哪怕0.1微米的誤差,都會直接廢掉整批產(chǎn)品,這也是小尺寸晶振過去長期依賴進口,國內(nèi)廠商花了十幾年才啃下量產(chǎn)硬骨頭的核心原因。1. 原石定向切割:0.01度的角度誤差都不能有小尺寸晶振的第一步,
    TKD泰晶科技 2026-08-07 08:43 524瀏覽
我要評論
0
點擊右上角,分享到朋友圈 我知道啦
請使用瀏覽器分享功能 我知道啦
主站蜘蛛池模板: 萧红电影高清免费观看| 疯狂的邻居韩国电影| 巜人妻初次按摩| 华胥引电视剧下载| 白日美人满天星免费播放| 无憾电影全集免费观看 | 新红楼梦剧情| 妈妈的职业5结局原声在线看视频| 一江春水向东流在线观看| 免费怀旧短剧| 麻花无痕传剧mv免费观看全集高清 | 好运连连旺全家:锦鲤少女全集免费| 三年高清观看免费大全一| 星空电影在线观看播放免费| 喜爱夜蒲2 ed2k| 凌云壮志女版满天星mv| 监狱疯云| 最新西游记| 空蝉之森酒法子完整版| 模特魅影快播| 美乃雀所有影片免费观看 | 狙击精英重装上阵| 支配教坛动漫免费版| 一区二区三区波多野结衣在线观看| 名侦探学院第五季| 麦乐迪马克斯超人| 西田麻衣种子| 艾斯奥特曼中文版| 我学生的爸爸中字ID| 名侦探柯南迅雷看看| 电影我的兄弟姐妹| 家有喜事2009| 你好骚哦我好喜欢什么歌的歌词| 电影美乃雀主演替夫还债| 品三国mp3| 心迷宫电影| 日本部长| 动真格了!渤海打响“第一枪”| 传闻中的陈芊芊| 浪漫女家教主演:黛比地区:台湾 | 青春期 电影| 布鲁克读大学| 永不磨灭的番号33| 朱锁锁叶总什么电视剧| 老婆6完整版国语电视剧| 翡翠原石教程| 志在出位| 女保险公司推销8中文| 安德鲁貂| 《脱轨》电视剧| 《东京塔越南女兵俘虏营》| 新猫和老鼠全集| 《淫的方程式》动漫| 猎罪图鉴2大结局| 斗罗大陆126| 振动器酷刑2| 亡者之谜泰剧在线观看泰剧| 猩疯血雨未删减| 天赐的声音第五季| 梅森探案集| 类似战狼六的欧式少女电影| 聊斋艳谭之鸳鸯戏床| 风云再起电影完整版| 战狼6双人版在线观看| 轧戏电视剧在线观看免费高清全集| 孝子电视剧| 少儿不宜的电影| 春日狂热| 日本伦理电影替夫还债| 冬暖花会开全集在线观看| 反黑英雄电视剧免费观看国语全集| 花与蛇麻醉牙医诊所| 韩剧《致命梦魇》免费播放| 《法国空乘4》成人版| 我的莫格利男孩电视剧免费观看| 不要恋爱要结婚 电视剧| 邵氏《金莲外传》中文在线观看| 魔弹战记| 狂飙电视剧在线观看免费完整版| 电视剧辛亥革命| 美姊妹牙医完整版在线观看| 美国式的家庭忌讳1—| 英雄黄海冰| 王菲执迷不悟| 西班牙掌中之物电影在线观看| 荒野求生无马赛原版在哪里看| 酒店1-75集全集免费播放| 小蓝电影| 美国1~5普通话| 金钱之味下载| 金鸡sss粤语| 深海利剑演员表| 电影《塔蒂亚娜2》在线| 姐妹牙医在线观看免费完整版| 原始武器 国语| 大侦探第七季在线观看免费版| 青田县| 魔帝归来:三界唯我独尊全集免费| 温泉艳遇| 灵魂摆渡在线观看免费完整版| 凌云志电视剧在线观看| 法国电影空姐第4部免费观看| 幸福触手可及百度百科| 电影《需要爸爸播种美国》在线观看 | 铜铜钢铿锵锵锵锵锵锵免费观看高清免费观看Afarc | 美丽妻子替夫还债| 24小时末路重生在线观看完整版| 女版战狼6泰国版高清 | 金瓶梅电视剧第5集电视剧| 激情网在线视频| 与凤行在线| 不良义姐真人版全集在线观看| 闪婚结局| 一路向西完整版在线播放| 霜降是什么时候| 新八仙过海传奇| 开船原声视频| 择君记电视剧在线观看完整版免费| 杰西简凯登凌云壮志无删减在线观看| 田耕纪电视剧免费观看完整版| 花与蛇3白衣绳奴| 品色AV| 天雷一部之春花秋月 电视剧| 大众健美操二级| 逆天改命:锦绣嫡女短剧全集 | 横冲直撞的游泳教练在线观看| 唐人街探案2免费观看高清版电影| 小川阿佐美作品| 麦乐迪版满天星无删减观看| 淘宝公布2023年度丑东西| 俘虏之锁~处女们淫秽的束缚~| 洪金宝再谈周星驰| 偷听女人心| 战狼5欧式少女全集| 成吉思汗电视剧音乐| 白嫖者联盟电影在线观看| 少女爱上姐姐明亮的三颗星| 雪豹坚强岁月46集播放| 工程车视频大全动画片| 小时代3:刺金时代| 与女部长一起去出差旅行的电影叫什么 | 超级鉴定师| 水卜樱剧情解析图解gif| 流浪地球2完整版在线看观看免费| 维修工人的艳遇在线免费观看| 黑鬼寄宿电影免费观看| 交谊舞慢三步| 法国空乘5在线播放| 正负之间台剧免费观看| 看不见影子的少年在线观看| 新四大名捕电视剧| 拔苗助长免费| 上流社会韩剧电影完整版观看| 战狼6国语版免费观看| 婚姻料理| 满天星小红帽| 冰血暴第二季| 唐人街探案1900在线观看| 走过花季| 姜子牙电影在线观看| 法国满天星《女军医》在线观看 | 《爸爸种子2》英文翻译| 电影《军中乐园》| 天海翼种子| 这个杀手好怕丑| 与老公上司偷情免费看| 海口一护士夜间被患者持刀伤害| 驱魔面馆| 牙克石市| 明仔大叔| 19岁大学生真人免费观看电视剧| 豆豆笑笑| 美女扒精光秘 免费观看 | 女老师的诱惑在线免费观看| 我们的当打之年| 西藏小子| 《人脉王》| 米奇妙妙屋第二季10| 美国版《健美》| 打回原址电影| 妈妈的职业5完整版结局在线看谁演的 | bigtitsvideos| 神雕侠侣在线观看| 漂亮的小瘦子 3| 美味风蛇图纸| 《布鲁克上大学》1978| 苏东坡陆毅版| 台湾版1987年渔夫野史| 七种贱粤语高清免费观看| 英雄时代| 姐姐3电视剧在线观看| 怪想售动漫| 甲午大海战下载| 无所畏惧40集分集介绍| 高清《紫罗兰永恒花园》动漫| 电影在线观看免费完整版| 《女子护卫队:满天星》在线观看| 台湾水电工完整版| 《屠宰森林》| 少狼第一季| 9.1免费电影| 夜夜嗨国产精品| XL上司令第一季02集免费观看最新一期| 美国电影《飘》免费观看中文| 高清《室友的妻子》在线播放 | 日本电影《律师坠落》的剧情简介魔| 战争与音乐电影完整版免费观看| 爱我几何完整版播放| 津门侠盗团| 女战狼6女战狼免费播放| 黑衣人3在线观看| 朋友的妈妈电影免费观看| 小小的我电影免费观看易烊千玺| 不会说话的爱电视剧免费观看| 《揉胸按摩》在线观看| 邻居家的姐姐| 台湾版《棘手狂情》演员表雅婷是| 疯狂七十二小时截了一段门徒| 电影在线观看高清完整免费观看| 一龙吊打空手道黑带| 韩讯五第二部| 新版金银梅5普通话主题曲叫什么 《罗丽星克迷宫》免费观看 | 倔强驱魔师动漫观看| 痲豆传媒免费观看| 《医生特殊的治疗》5 | 地狱究竟有几层在线观看电影| 冒牌老爸高清下载| 维修工的艳遇电影免费| 陪读妈妈电视剧免费版全集播放| 《维修工》电影王李丹妮在线观看| 桦甸市| 盗墓笔记谜海归巢| 九霄龙帅短剧免费观看| 《卖保险套销售员》导演麦金| 岳母的幸福生活百度影音| 同学的妈妈5观整有限中字| 莉娜安德森《满天星》电影在线观看 | 南妹儿动感光波| 画皮2 bt| 一起嗟嗟嗟30分钟免费看| 罗百吉的老婆| 隐秘的角落电视剧在线播放 | 儿媳的味道| 小东西逃跑是要受到惩罚的| 销售的销售秘密3HD中字| 神探阿蒙第一季| 电影塔日酒店完整版满天星| 画皮真爱无悔| 和讨厌的部长出差电影 | 年轻夫妇韩剧中文版免费观看| 《私藏》短剧免费播放| 《啄木鸟:军事不当行为》| 火山上的两个人电影在线观看| 警花交换做爱| 周杰伦林俊杰合唱稻香| 贝拉1980在线观看| 风语者高清| 巜性的暴行》无码| 盖世帝尊动漫在线观看完整版免费 | 四大名捕大结局下载| 少林寺 电影| 燃烧的玫瑰| 高清写写画画| 爱唯侦察在线观着| 父母爱情电视剧在线观看| 放在里面边顶边吃饭| 军火女王 第二季| 泸州电视台直播| 命悬一生免费观看完整版| 3d肉蒲团迅雷下载| 电视剧 红楼梦| 了凡四训电视剧完整版免费观看| 古堡女仆在线观看| 最强大脑第八季免费观看完整版 | 激战丛林完整版在线观看免费| 杏林春暖 下载| 妈妈的职业5韩剧结局原声| 撒贝宁崔永元| 档案南海风云| 凤与朝电视剧免费观看| 聊斋残卷六道天书电影在线观看| 我们的父辈完整版免费观看| 仁粹大妃| 灵魂符咒| 电视剧《雪迷宫》32集播放| 义姐是不是良喂养1-2集动漫在线观看 | 风家七小姐| 阿姨大小姐| 日剧电影维修工人的艳遇| 亲爱的孩子| 禁忌5在线观看完整版电视剧免费| 雷速登闪电冲线第3部全集| 《小小诊所》| 孪生兄妹| 撞击高贵美妇老师的翘臀| 笑傲江湖中东方不败是男是女| 胜女的代价2在线观看| 她的私生活| 火影忍者在线观看免费全集| 按摩乳房的电影| 玉米靠什么传播种子| 丰满的临时工BD| 科洛斯风云| 四川40岁阿姨免费观看电视剧| 父母儿女媳妇一起来玩的说说| 《医生特殊的治疗》免费看| 美国街头篮球| 北京爱情故事39| 维修人员的培训免费观看| 嫡女毒妃:重生飒爽短剧全集| 韩国维修工干少妇| 卢靖姗顺产36小时生下女儿| 部长来家做客无删减版中文 | 好妈妈7在线观看完整电影| 白峰电影高清播放在线观看| 电视剧雪豹全集| 二连浩特吧| 超人大变身全集| 我和黑大佬的365天| 瑞克和莫蒂第一季免费观看| 魔幻手机第一部| 修理师傅的艳遇无删减| 美版假面骑士龙骑| 睫毛膏3欧美版| 春日狂热| 建阳市| 绽放的许开心全集免费观看高清| 爱情回来了结局| 高清《奋斗吧人生-演员篇》| 盲心贵女短剧在线观看免费全集| 美国怪谭| 特朗普称美国正从内部死亡| 女佐罗在线看| 昔有琉璃瓦电视剧免费观看全集| 法国空乘4免费完整版在线播放| 玉璞团之鉴宝2高清| 电影珍品| 清楼十二楼房| 流浪的地球| 日韩伦理片 儿媳妇的味道| 婆婆来了26| 安吉拉主演的《透视》电影免费观看| 苹果在线观看| 白玉县| 心灵法医 电视剧| 反抗之真心英雄剧情| 欧锦棠电视剧| 奇门遁甲国语版| 731实验女子配狗生出什么| 沉默的羔羊香港版| 禁忌1980满天星帕克| 卜卦mv| 电影《汤唯》免费观看高清| 头号前妻电视剧全集| 高清盐沼之下未删减| 电影粉红女士满天星| 晚娘下部| 空乘2023法版在线观看| 国家机密2| 家门的荣光央视版| 朋友的母亲韩剧| 高清《深潜》免费观看完整版在线| 电影《绿茵星妈》在线看免费高清 | 被合租刑警的粗汉肉H高NP | 高清《蜜桃成熟时5》国语| 超神学院第5集| 咱们裸熊第一季| 羽月希在线免费观看视频| 跑男第十二季免费播放| 庶女有毒全集免费| 狼狈 泽尻英龙华| 昼颜 电影| 一念永恒动漫免费观看| 恩娇韩剧电影完整版免费观看| 爱色吧在线电影| 原始的爱意大利| 播放_刚结婚陪部长出差的日子免费在线观看_看星星电影 | 《女子护卫队满天星》全集免费观看 | 练歌厅火辣的女人们| overflow樱花| 海霞免费| 阜新市| 麻辣烫爱在一起| 国色芳华电视剧免费播放策驰影视| 电影17·3免费观看完整版在线观看 | 家门的复活| 青春荷尔蒙2 完整版| 莉娜安德森《满天星》电影在线观看| 电视剧海上繁花免费观看| 无心法师3在线观看免费完整版 | 翁虹版《一代妖后》| 花与蛇全集| 亲吻姐姐剧场版oad| 飞刀又见飞刀百度云| 《激战丛林》完整版免费观看中文字| 限制别人网速| 两个人免费观看在线高清| 盗墓笔记 电视剧| 人口9万人小县城单日游客过万| 需要爸爸播种2免费在线观看| 刀马旦电影| 电影《牙医姐妹》正片| 总裁的小甜妻全集免费| 高清我们的错误| 三人一次性体验在线观看| 地下交通站第一部全集免费观看| 长葛市| 3d蜜桃熟了| 《热血》免费观看| 湿润的继拇HD中文| 江南媳妇| 台剧《floss》在线看| 夜色暗涌| 海底小纵队第10季全集免费完整版| 日本三级维修工的艳遇| 牟氏庄园电视剧全集免费观看| 大兵的寝室电影| 风云年代40全集免费观看| 国语译制片| 女版捉鬼敢死队在线播放| 魔发奇缘动漫| 女超人满天星在线观看完整免费高清| 潜伏者40集在线播放免费| 芈月传在线观看免费| 义姐不是良妈ova观看方式| 壮士出征全集| 花房姑娘第五季免费大全好看| 赘婿电视剧全集36集在线播放| 姐姐的朋友2在线观看| 夫妻生活影片| 超级经纪人在线观看| 需要爸爸种子免费观| 巜出轨上司的人妻2中字| 霍比特人意外之旅| 你礼貌吗是什么梗| 薄暮传说剧场版| 《金银瓶1-5HD》普通话红楼艳谭| 刺客聂隐娘| 新还珠穿帮镜头| 游戏大作战泰剧在线未删减版 | 深圳卫视决胜制高点| 儿童歌曲快乐的节日| 按摩推油按摩极品电影| 甄嬛传第57集| 沙海电视剧免费观看| 闪婚厚爱全集免费| 苹果范冰冰无删减| 大胸的丰年经的继拇| 一步之遥电影下载| 山西科教频道| 《overflower》第一季动漫真人版| 女烈受刑| 空姐妻子的秘密第三季剧情介绍| 著名养猪专家姚民仆逝世 | 美容院的特殊待遇完整版| 电视剧小站风云| 酒店实行生免费完整版| 见面4秒就合体| 黑暗侵袭1| 啄木鸟:女版《壮志凌云》电免费观看| 异形vs人类| 《卖保险套的女销售》电影免费观看 | 日本儿子上妈妈| 后妈难当在线观看完整免费高清电影| 与凤行电视剧免费观看完整版| 美女脱个精光扒开| 那刻的怦然心动| 白嫖者联盟在线观看免费| 死亡笔记 日剧| 《消失的她》免费观看完整版下载| 死神来了8在线观看完| 电影追龙2| 乱点鸳鸯谱| 私人女性監獄| 舒服吗我厉不厉害| 沐浴之王在线| 落魄贵族琉璃川在线观看全集| 新羔羊医生下载| 摩登时代电影| 插曲的痛30集全集观看免费西瓜 | 花子vs倔强驱魔在线观看| 孔祥东小汤2| 晚秋的结局是什么意思| 凶宅处理专员在线全集观看| 偷窥无罪电影| 绝世唐门第60集免费观看| 欧美金银1-5美国双人| 打黑风暴在线观看| 300:帝国崛起未删减版| 义姐是不是良女动漫全集| 七根心全集在线播放免费| 度华年免费看| 至高侵袭| 逆世界百度影音| 铿铿铿锵锵锵锵免费观看| 一点就到家免费观看| 无名天使3d国语| 美国一级伦理巜生殖按摩| 韩剧哦亲爱的| 战狼9电影| 星空影视论语《部长出差的日子》 | 正阳门下全集免费| 伏妖白鱼镇3除魔卫道| 人猿泰山1995免费观看完整版| 浪姐3免费观看全集在线| 以爱为营1-30集免费观看| 想要父亲的种子电影在线观看| 异形:人族的统治| 加勒比海盗1黑珍珠的诅咒| 后妈难当在线观看完整免费高清电影 | jk淫行教师| 东航马德里| 木下澶澶子最新电影| 假日暖洋洋电视剧在线观看免费| 最佳贼拍档| 昨晚湖南卫视| 澳门回归22周年| 吴健版农民伯伯国语免费看| 八卦神探国语电视剧全集在线观看| 十三邀 第九季| 混战两姐妹| 圣德罗佩斯的姑娘们在线播放 | 黑白配中文版免费观看视频| 电视剧冰锋| 至尊马蒂| 风云再起:龙帅归来短剧全集| 牛莉电视剧| 麦乐迪马克斯满天星电影免费播放| 死亡救赎| 最后的深爱韩国电影| 《女学生的滋味》| 斛珠夫人电视剧在线观看| 《折腰》1-36折腰电视剧| 农民伯伯下乡三级片| 《黑暗荣耀》第二季| 春雨电影大全免费观看动漫版视频| 《倔强驱魔师》免费观看| 善良的女儿| 斗六市| 廖琴 哭泣的女人| 肉蒲团高清| 海外版电影《爱很烂》剧情| 斗罗大陆第4部终极斗罗| 电影欢乐英雄| 美貌的社长夫人| 钢筋规范| 依兰爱情故事电影免费观看 | 火影忍者第1集| 女子护卫队1973满天星高清版| 高清《极速车魂 第三季》电视剧 高清《黑皮书》电影 | 异人君莫邪第一季在线观看| 机场特警评价| 三年大片高清免费观看完整版| 绝世战魂免费观看完整版动漫| 肉肉的小黄车| 《部长出差的日子》中字| 主君的太阳全集| 与爱同居泰剧在线观看| 动感之星妖精179集视频| 你是我的荣耀免费观看完整版星辰| 仙逆128集完全版播放| 女版西游记大波唐三藏香港版| 中国远征军 下载| 初次爱你电视剧| 凌云志志(法国)满天星在线看| 王保长歪传高清| 五福星全集| 博视频微博《韩剧《隐形的| 灾女变福妻:全家都宠我全集免费| 逃亡兔前传| 我们在黑夜中相拥免费全集| 罪恶王冠my dearest| 《overflower》真人版演员表| 杀戮天使第二季| 千金丫鬟电视剧在线观看完整版| 《美姐妹牙医》完整版| 漂流欲室剧情| 青面修罗电影在线观看免费| 小小之少女16| 詹伯奥特曼| 家教韩国| 我要爸爸播种子电影在线观看| 秘密爱韩剧完整版| 屠宰森林| 麦盖提县| 顾总他很可怜| 漂亮妹妹在线观看免费高清电视剧| 魔法灰姑娘在线观看| 高清《极恶老大》| 《无敌少侠 第四季》| 一起来看流星雨配音| 后营露宿第8集| 简言的夏冬在线观看| 逛新城简谱| 野外强伦轩女教师HD| 中国菲律宾撤侨| 东京复仇者真人版在线观看| 在姨母家的客厅完整版| 甄嬛传63集剧情| 电视剧来不及说我爱你| 需要爸爸种的种子完整版| 白日美人满天星免费播放| 女子瑜伽课被压断腿| 秘密女搜查官| 白色请人家| 借枪30| 东京混血大学生精油按摩视频免费资 | 人民公社大食堂| 战狼6欧美版免费资源下载| 真爱背后全集| 逆仙在线观看免费观看完整版| 红原县| 大秦赋在线观看免费全集完整版| 妈妈奖励儿子被暖哭| 地心历险记2神秘岛在线观看| 法医秦明免费全集观看| 梦境之树| 三国连太郎| 人猿泰山h版未删减| 我主沉浮电视剧| 返老还童电影| 电影返老还童| 插曲的痛第60集全集免费播放做爱小视频| 焦土之城剧情| 黄晓明潜行者电视剧| 3d柔铺团之极宝乐鉴宝普通话版| 我是传奇第三期| 新结婚时代在线观看| 91密桃| 高级家教老师| 星际迷航1百度影音| 插曲的痛第60集免费观看高清| 月嫂苏媚的小说免费阅读| 儿子谈琼瑶去世细节| https://www.yalan365.com/shiwutv/tvgppaiz.html | 金瓶梅在线观看免费完整视频国语| 《超女麦乐迪》在线播放| 电视剧正阳门下全集| 一国两制的核心| 插曲在线观看免费观看高清第二集| 圣德罗佩斯的姑娘们在线播放| 黑狐之风影| 星克莱尔《总统夫人》| 慈禧秘史邱淑贞| 雁南飞刀郎| 《屠宰呕吐娃娃》免费观看完整版| 韩国高清在线观看| 宝贝计划国语完整版百度影音| 酒店1—60集| 色即是空在线电影| 超级乐8点| 小女花不弃剧情| 美女脱个精光扒开| 变形金刚3国语| 肇庆长城宽带电影网| 牧教师4| 如果还有明天美剧| 金瓶梅在线观完整版观看视频| 倔强驱魔师1-4集完整版| 执法者们粤语在线观看| 高清《裂口女》大结局| 喜爱夜蒲粤语完整版| 夫妻交换视频| 张昊唯暂停演艺工作| 斗罗大陆免费完整观看181集| 电影需要爸爸播种子屠夫电影网 | 爱欲狂潮| 新版金银悔5-8普通话1| 激情艳女| 东风破电视剧全集| 伦理厨房与继牳3| 中国女排对波兰女排直播| 电影之家2013| 周二谋杀定律电视剧| 日本一卡二卡在线播放| 伪装者电视剧全集观看| 箭在弦上42| 《品味人生》免费资源汇总| 新金瓶梅3d高清完整版| 云裳广场舞爱情果| 漂亮小瘦子3| 孤舟电视剧36集全免费播放| 名门望族粤语| 进击的巨人百度影音| 电影《暴行3》| 致命打击| 刘亦菲合成10p| 《被下药强辱的妻子》在线观看| 哈法欧尼| 另一个贝内特家的姐妹未删减| 游击英雄| 三年国语版免费观看视频| 神枪电视剧| 罗百吉的老婆| 法国女仆电影在线观看完整免费高清原声满天星下载 | 一见钟情| 死亡地带第一季| 第三次初恋| 警告安全电影| 回复术士118集真人版剧情介绍| 黄土高天电视剧| 高清《四大元素之水之魅影》电视剧 | 华丽的外出电影韩国版在线观看| 重紫电视剧免费观看| 爸爸需要你的种子| 邻居也疯狂电视剧| 迷你世界星球版本| 韩国瘦子7| 高清《秘密》电影全集| 时光与你都很甜电视剧免费| 满天星《瓜达卢佩的玫瑰》| 好奇害死猫| 超人未删减| 机器人总动员全集| 法国空姐3在线播放| 韩国电影《瑜伽教练》的主演是谁| 第三次初恋| 《炸天小姐》在线观看美国| 奔跑吧兄弟第八季| 无人区日本电影在线观看| 八戒八戒在线观看免费高清4| 激情丛杕| 贝多芬小姐的启示电影| 人生若只如初见 奈何情深缘浅 | 龙珠剧场版全集| 男生女生嗟磋嗟磋磋| 一拳超人第二季在线观看免费| 恶魔奶爸2季| 电影《种马猎人》免费看| 日本译制片推理片| 朋友的妈妈完整| 96分钟:列车爆炸案| 火热的部长妻子| 她很漂亮韩剧高清在线观看| 美女食神优酷| 《屠宰餐厅》美国| 东京残酷jc| 《纣王妲己》全集观看 | 万法归一| 谁是真英雄电视剧| 《销售的秘密2》在线看 | 《荆棘》| 快乐的小鸡| 午夜寂寞安卓影院| 电视剧永不回头| 铁路火车动画| 交换年长的麦子高清下载方法| 老虎出更国语| 特区爱奴百度影音| 好歹一家人电视剧| 洒店1-100集| 特种兵之火凤凰45| 性感海滩3丝袜补丁| 蓝白红三部曲之红电影| 义姐不是不良妈妈动漫在线观看 | 继拇再也忍不住了HD| 苍井空经典电影| 大西洋帝国第一季| 快乐到死 在线观看| 金银瓶2008版徐少强| 精忠岳飞背景音乐| 冬暖花会开| 主谋全集观看| 大乳房少婦按摩電影| 放逐免费| 奇葩说第六季在线观看| 天地男儿国语版免费观看| 私人女子监狱视频中文字幕版 | 神秘飞行物曾撞击月球背面| 牙医姐妹郝板栗完整版电影| 海贼王 百度影音| 开棺免费观看| 数学皇冠上的明珠| 美姊妹剥赤板栗| 跟着书本去旅行| 虎兄虎弟 国语| 燕子李三传奇电视剧| 出差和讨厌的社长同住最可恶的部长| 妖精的尾巴33| 婚姻料理| 骄阳似我2025免费观看| 欧美黑白配在线免费观看| 紧扣的星星完整版动漫免费观看高清| 夏日福星粤语版| 心花路放豆瓣| 0verflwer第一季无码| 三女片免费观看电视剧杨贵妃传| 《漂白》| 趟过女人河的男人全集| 陪讨厌部长去出差旅日本| 考比网站| 365情| 光头佬的电影| 偷窥无罪电影| 剧组的故事| 《女员工的滋味》| 老婆9免费完整高清电视剧在线| 小蜜挑5| 破毒电影完整版在线观看高清| 完美世界dj| 《永不磨灭的番号》电视剧| 新人类2毒医肥尸国语| 玛戈没钱了| 林风短剧免费全集播放| 一路向北全集免费观看| 我的好继拇HD| 《哪吒3》在线观看| 底线 电视剧| 宇宙巡警露露子| 香醇绣感2普通话版剧情介绍| 夏日大作战qvod| 雾都猎狐| 兵临城下电影在线观看| 天海翼正在播放| 卸岭秘录电影免费观看| 空房间电影高清免费观看全集| 鲁邦三世特别公映版| 朱莉安妮版售楼女王免费观看| 惊变未删减| 进击的巨人佩妹| 驯服小峓子HD中字| 非诚勿扰电视剧| 自由影视| 命运 电视剧| 喜爱夜蒲3国语完整版| 妈妈的职业5完整版结局在线看谁演的 | 美丽的秘密4动漫免费观看| 色女仆网站| 雅典奥运会男篮决赛| 蜘蛛侠3英雄无归在线免费观看| 《女狱警》法国正版| 好妈妈3高清迅雷在线观看| 星之金币| 黑道大佬第2季免费观看| 想一个人死去| 大胸按摩电影| 地爆天星意大利完整版| 一起愁愁愁愁愁愁在线观看电视剧| 《睫毛膏4》美国电影在线观看 | 蓝色隐形帽子完整版在哪看| 地铁跑酷2| 波奇亚电影在线观看| 中业岛地图| 女超人melody| 私人女子监狱意大利1982年 | 法国空姐4| 香港之夜免费观看| 白峰美羽《被讨厌的上司》完整版 | 马大姐新传| 《邻居的妻子| 白峰电影免费播放在线|