道道指令皆辛苦...
從前讀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