亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

Chinaunix

標(biāo)題: arm中mov r0, r0的作用是? [打印本頁]

作者: jwwzhh    時間: 2011-07-14 23:20
標(biāo)題: arm中mov r0, r0的作用是?
在內(nèi)核中,我看到過好幾處使用了mov r0, r0的指令。我知道它是一條空語句,就是讓cpu多運行一條指令,相當(dāng)于有些單片機的nop指令。但是不理解為什么要是用這條指令,比如:
arch/arm/kernel/entry-common.S:在執(zhí)行用戶程序時,發(fā)生中斷,當(dāng)中斷處理完后,下面這段程序就是返回的一些操作。
  1. /*
  2. * "slow" syscall return path.  "why" tells us if this was a real syscall.
  3. */
  4. ENTRY(ret_to_user)
  5. ret_slow_syscall:
  6.         disable_irq                                @ disable interrupts
  7.         ldr        r1, [tsk, #TI_FLAGS]
  8.         tst        r1, #_TIF_WORK_MASK
  9.         bne        work_pending
  10. no_work_pending:
  11.         /* perform architecture specific actions before user return */
  12.         arch_ret_to_user r1, lr

  13.         @ slow_restore_user_regs
  14.         ldr        r1, [sp, #S_PSR]                @ get calling cpsr
  15.         ldr        lr, [sp, #S_PC]!                @ get pc
  16.         msr        spsr_cxsf, r1                        @ save in spsr_svc
  17.         ldmdb        sp, {r0 - lr}^                        @ get calling r0 - lr
  18.         mov        r0, r0
  19.         add        sp, sp, #S_FRAME_SIZE - S_PC
  20.         movs        pc, lr                                @ return & move spsr_svc into cpsr
  21. ENDPROC(ret_to_user)
復(fù)制代碼
就是不明白上面這里指令mov r0, r0的用意。誰能給我個答案,這個問題已經(jīng)困擾我半年之久了。
作者: jwwzhh    時間: 2011-07-15 09:37
自己頂一下。這條語句是比較常見的,怎么沒人幫一下?期待中啊。。。。。。
作者: platinum    時間: 2011-07-15 09:55
譯碼時有的會譯成 mov r0, r0
但實際就是 nop
作者: jwwzhh    時間: 2011-07-15 11:24
對啊,它就是nop指令,我的意思就是,為什么這里需要nop指令。
作者: amarant    時間: 2011-07-15 11:43
貌似跟流水線什么的有關(guān) 以前在哪看過,記不清了
作者: jwwzhh    時間: 2011-07-15 13:33
是的,我原來也是這么想的,但是感覺不踏實,總覺得可能還有什么其它的。
不知道這樣解釋對不對:
ldmdb        sp, {r0 - lr}^          雖然該指令執(zhí)行完了,但是可能數(shù)據(jù)還沒有真正完全傳遞完。
mov         r0, r0                       
add           sp, sp, #S_FRAME_SIZE - S_PC
movs        pc, lr                        pc=lr,cpsr=spsr,引起模式切換。因此在ldmdb和本條指令之間需要有兩條指令進行間隔。
我上面的解釋是沒有什么依據(jù)的,只是一點想法。希望各位大佬能夠解釋清楚,讓我可以安心,謝謝!
作者: platinum    時間: 2011-07-15 14:06
剛才做了一個實驗
ARM 指令(非 thumb),32bit

  1.         mov r15, r15
  2.         mov r14, r14
  3.         mov r13, r13
  4.         mov r12, r12
  5.         mov r11, r11
  6.         mov r10, r10
  7.         mov r9, r9
  8.         mov r8, r8
  9.         mov r7, r7
  10.         mov r6, r6
  11.         mov r5, r5
  12.         mov r4, r4
  13.         mov r3, r3
  14.         mov r2, r2
  15.         mov r1, r1
  16.         mov r0, r0
  17.         nop
復(fù)制代碼
編譯、譯碼后的結(jié)果如下

  1.    0:        e1a0f00f         mov        pc, pc
  2.    4:        e1a0e00e         mov        lr, lr
  3.    8:        e1a0d00d         mov        sp, sp
  4.    c:        e1a0c00c         mov        ip, ip
  5.   10:        e1a0b00b         mov        fp, fp
  6.   14:        e1a0a00a         mov        sl, sl
  7.   18:        e1a09009         mov        r9, r9
  8.   1c:        e1a08008         mov        r8, r8
  9.   20:        e1a07007         mov        r7, r7
  10.   24:        e1a06006         mov        r6, r6
  11.   28:        e1a05005         mov        r5, r5
  12.   2c:        e1a04004         mov        r4, r4
  13.   30:        e1a03003         mov        r3, r3
  14.   34:        e1a02002         mov        r2, r2
  15.   38:        e1a01001         mov        r1, r1
  16.   3c:        e1a00000         nop                        ; (mov r0, r0)
  17.   40:        e1a00000         nop                        ; (mov r0, r0)
復(fù)制代碼

作者: jwwzhh    時間: 2011-07-15 14:54
在arm中nop是偽指令,它實際翻譯成mov r0, r0。
我的問題提的不是很好?我想說的是,為什么需要添加mov r0,r0,或者說nop偽指令。
作者: platinum    時間: 2011-07-15 15:01
你是想問為什么要設(shè)計一個 nop 指令,是這個意思嗎?
作者: jwwzhh    時間: 2011-07-15 15:06
不是,你看一下我的主帖。我指的是在這里代碼中為什么要用nop指令。
作者: jwwzhh    時間: 2011-07-15 16:12
等高手啊。
作者: xzko    時間: 2011-07-15 16:40
這可能是一個臨界問題,如果不加nop,從arm5級流水線來看在"movs pc, lr"執(zhí)行階段正好是ldmdb回寫寄存器階段,這條ldmdb指令是恢復(fù)user模式下的r0-lr寄存器,movs指令一旦執(zhí)行就會切回user模式并丟棄之后預(yù)取指令,如果ldmdb回寫操作和cpu模式切換寄存器恢復(fù)操作同時發(fā)生就可能在切回user模式后寄存器的值是錯誤的,如果加了一句nop就能錯開這兩個操作了。
作者: fei1700    時間: 2011-07-15 18:17
我也是記得跟ARM三級流水線有關(guān),比如MMU enable前的2條語句就是廢語句,無法執(zhí)行到的,所以就用類似nop來填充。但是中斷返回時總是說起lr -4,這里的mov r0 r0后面也還有一條,所以我都不明白了,我認為要么最后2句都廢了,不然一條nop也沒用
作者: jwwzhh    時間: 2011-07-15 21:55
非常感謝12樓,我剛才認真研究了一下,arm的5級流水線結(jié)構(gòu),確實是這樣。這就是為什么加nop指令的真正原因了。謝謝!
作者: 吾愛夏日長    時間: 2011-07-16 14:59
為了達到指令流水線平衡,CPU的執(zhí)行順序是預(yù)取,譯碼,執(zhí)行三步,插入一條空指令可以使流水線更加流暢,更加高效
作者: fei1700    時間: 2011-07-18 22:44
本帖最后由 fei1700 于 2011-07-18 22:56 編輯

回復(fù) 12# xzko

完了,我還是不明白,把印象的三級替換成五級,我看的某五級資料寫的是回寫和執(zhí)行會錯開,那么也就不應(yīng)該有所描述的問題了?

由于采用馮-諾依曼體系結(jié)構(gòu),不能夠同時訪問數(shù)據(jù)存儲器和指令存儲器

ldmdb   取指    譯碼   算地址   訪存   回寫
add                 取指   譯碼      執(zhí)行
movs                        取指       譯碼   執(zhí)行
             T1       T2      T3        T4     T5
T5可能沖突,但流水線應(yīng)該是下面這種吧

ldmdb   取指     譯碼   算地址   訪存   回寫
add                 取指                譯碼             執(zhí)行
movs                         取指               譯碼             執(zhí)行
             T1       T2       T3       T4      T5      T6     T7
多了2個周期,沒沖突

[attach]496383[/attach]

圖片要怎么顯示出來啊
作者: ckanhw    時間: 2011-07-19 18:32
有沒有可能是為了設(shè)置標(biāo)記位
作者: fei1700    時間: 2011-07-25 22:25
我還是頂一下,后來我問的,因為處理器本身已經(jīng)有做到 執(zhí)行和會回寫不同時,而隔開一個周期,那么為什么還要認為只有mov r0,r0來避免處理器缺陷呢?

不是這個T5時段的沖突
ldmdb   取指    譯碼   算地址   訪存   回寫
add                 取指   譯碼      執(zhí)行
movs                       取指      譯碼   執(zhí)行
             T1       T2      T3        T4     T5

而是下面這個,早就錯開了
ldmdb   取指     譯碼   算地址   訪存   回寫
add                 取指                譯碼             執(zhí)行
movs                         取指               譯碼             執(zhí)行
             T1       T2       T3       T4      T5      T6     T7
作者: azzurris    時間: 2011-07-26 10:39
我還是頂一下,后來我問的,因為處理器本身已經(jīng)有做到 執(zhí)行和會回寫不同時,而隔開一個周期,那么為什么還要 ...
fei1700 發(fā)表于 2011-07-25 22:25


請問關(guān)于這句話“處理器本身已經(jīng)有做到 執(zhí)行和會回寫不同時,而隔開一個周期”,有哪本書或者資料上提到過嗎。
另外,你前文里說是馮諾依曼結(jié)構(gòu),arm處理器不是哈佛結(jié)構(gòu)嗎?
作者: fei1700    時間: 2011-07-26 13:33
回復(fù) 19# azzurris


http://wenku.baidu.com/view/b261f0d376a20029bd642de7.html

ARM流水線關(guān)鍵技術(shù)分析與代碼優(yōu)化
時間: 2009-03-30 10:15:21 來源:單片機與嵌入式系統(tǒng)  作者:大連理工大學(xué) 邱鐵 西方 遲宗正

2.1 帶有存儲器訪問指令的流水線
作者: azzurris    時間: 2011-07-26 14:37
回復(fù)  azzurris




ARM流水線關(guān)鍵技術(shù)分析與代碼優(yōu)化
時間: 2009-03-30 10:15:21 來源:單片機與嵌 ...
fei1700 發(fā)表于 2011-07-26 13:33



    非常感謝,我先看看
作者: azzurris    時間: 2011-07-26 15:53
好像你理解有誤吧,采用五級流水的就是哈佛結(jié)構(gòu),比如arm9。包括你提供的資料里面寫的也是:arm9系列則采用了五級流水的哈佛結(jié)構(gòu)。不是馮諾依曼結(jié)構(gòu)。
你說的2.1節(jié),應(yīng)該描述的是3級流水的arm7.

關(guān)于arm9的五級流水線哈佛結(jié)構(gòu),這里有個簡單介紹http://infocenter.arm.com/help/t ... i0022a/DVI0022A.pdf
作者: fei1700    時間: 2011-07-26 22:27
好像你理解有誤吧,采用五級流水的就是哈佛結(jié)構(gòu),比如arm9。包括你提供的資料里面寫的也是:arm9系列則采用 ...
azzurris 發(fā)表于 2011-07-26 15:53


謝謝你,是理解錯了

我有看到一個專門寫pipeline harzards 第15-31頁有專門說到幾種harzards及LDR interlock。
[PDF] ARM Processor Architecture

http://www.google.com.hk/url?sa=t&source=web&cd=4&ved=0CDUQFjAD&url=http%3A%2F%2Ftwins.ee.nctu.edu.tw%2Fcourses%2Fsoclab_04%2Fhandout_pdf%2F03_ARM_Processor_Architecture.pdf&rct=j&q=arm%205-stage%20pipeline%20hazards&ei=8ckuTovWK63ymAWWmfhF&usg=AFQjCNETBVkQ9BZW-L6iVTJ1r2xXNvPi4A&cad=rja
---------------------------
Pipeline Hazards
  There are situations, called hazards, that prevent the next
  instruction in the instruction stream from being executing
  during its designated clock cycle. Hazards reduce the
  performance from the ideal speedup gained by pipelining.
  There are three classes of hazards:
   – Structural Hazards
       • They arise from resource conflicts when the hardware cannot support all
         possible combinations of instructions in simultaneous overlapped
         execution.
   – Data Hazards
       • They arise when an instruction depends on the result of a previous
         instruction in a way that is exposed by the overlapping of instructions in
         the pipeline.
   – Control Hazards
       • They arise from the pipelining of branches and other instructions that
         change the PC



后來又看到那個文后面的3.1節(jié)描述了,也貼一下
http://www.21ic.com/app/embed/200903/34441_2.htm

3.1 五級流水線互鎖分析
    五級流水線只存在一種互鎖,即寄存器沖突。讀寄存器是在譯碼階段,寫寄存器是在回寫階段。如果當(dāng)前指令(A)的目的操作數(shù)寄存器和下一條指令(B)的源操作數(shù)寄存器一致,B指令就需要等A回寫之后才能譯碼。這就是五級流水線中的寄存器沖突。如圖6所示,LDR指令寫R9是在回寫階段,而MOV中需要用到的R9正是LDR在回寫階段將會重新寫入的寄存器值,MOV譯碼需要等待,直到LDR指令的寄存器回寫操作完成。(注:現(xiàn)在處理器設(shè)計中,可以通過寄存器旁路技術(shù)對流水線進行優(yōu)化,解決流水線的寄存器沖突問題。)

    雖然流水線互鎖會增加代碼執(zhí)行時間,但是為初期的設(shè)計者提供了巨大的方便,可以不必考慮使用的寄存器會不會造成沖突;而且編譯器以及匯編程序員可以通過重新設(shè)計代碼的順序或者其他方法來減少互鎖的數(shù)量。另外分支指令和中斷的發(fā)生仍然會阻斷五級流水線。
作者: azzurris    時間: 2011-07-28 09:41
謝謝你,是理解錯了

我有看到一個專門寫pipeline harzards 第15-31頁有專門說到幾種harzards及LDR i ...
fei1700 發(fā)表于 2011-07-26 22:27



    你找資料的能力真強啊,我就沒找到。還能介紹一些有關(guān)arm結(jié)構(gòu)的不錯的資料嗎。
作者: Cloudprogram    時間: 2024-04-20 21:12
本帖最后由 Cloudprogram 于 2024-04-20 21:20 編輯

回復(fù) 12# xzko

ARM7TDMI-SData Sheet
ARM7DI Data Sheet
R15 not in list and S bit set (User bank transfer)
For both LDM and STM instructions, the User bank registers aretransferred rather than theregister bank corresponding to the current mode. This is useful for saving theuser state on process switches.Base write-back should not be used when this mechanism is employed.
When the instruction is LDM, care must be taken not to read from abanked register during thefollowing cycle (inserting a dummy instruction such as MOV R0, R0 after the LDM will ensure safety).
官方手冊 說明ldm 操作用戶模式寄存器的時候后面要注意不要訪問寄存器,一般加nop語句。
arm體系結(jié)構(gòu)與編程
P99頁
LDM(2)用戶模式的批量內(nèi)存字數(shù)據(jù)讀取指令
指令的使用
在本指令的后面不能緊跟訪問備份寄存器(bankedregisters)的指令,最好跟一條NOP指令。
在用戶模式和系統(tǒng)模式下使用本指令會產(chǎn)生不可預(yù)知的結(jié)果。

未命名圖片.jpg (409.05 KB, 下載次數(shù): 15)

arm體系結(jié)構(gòu)與編程

arm體系結(jié)構(gòu)與編程





歡迎光臨 Chinaunix (http://www.72891.cn/) Powered by Discuz! X3.2