發表文章

目前顯示的是 7月, 2013的文章

文章總列表

道道指令皆辛苦...

從前讀ARM instruction set的時候, 覺得CPU提供一大堆addressing mode很煩 那時候想說, 反正就是多一道兩道指令, 何必這麼辛苦? 最近有機會提CPU enhancement proposal, 需要仔細review C code和assembly code 舉例來講, C code可能長這樣...     WRITE(ADDR, 0xaaaa) 首先是寫constant的部分, 需要三道指令才做得完     load #ADDR, r0     load #0xaaaa, r1     store r1, [r0] 接著我們就會想, 如果可以直接把constant塞到instruction的話 就可以少一道指令, 也可以少用一個register     load #ADDR, r0     store 0xaaaa, [r0] ---- 接著繼續思考不同的C code...     WRITE(ADDR, 0xaaaa)     WRITE(ADDR+1, 0xbbbb) 把上面的enhancement拿來用, 會變成這樣...     load #ADDR, r0     store 0xaaaa, [r0]     add r0, #1     store 0xbbbb, [r0] 如果遇到連續的address寫入, 這樣就會多一道中間的addi, 看起來有點討厭 如果讓store做完的時候, 同時把address pointer +1, 這個問題就可以被完美的解決     load #ADDR, r0     store 0xaaaa, [r0], #1     store 0xbbbb, [r0], #1 這樣一來, 除了第一道指令載入address, 剩下都可以1cycle寫一筆出去 ---- 然後接著又會想, store constant的指令, 寫完就+1是不是我們要的行為? 有些硬體用indirect的方法存取, 行為像是這樣...     WRITE(PERI_ADDR, 0x100)     WRITE(PERI_ADDR+1, 0xaaaa) // peri[0x100] = 0xaa