底下是我在 OpenRisc 中,在 SW/support.c 底下的部份source code.
void or32_exit (int i)
{
asm("l.add r3,r0,%0": : "r" (i));
asm("l.nop %0": :"K" (NOP_EXIT));
while (1);
}
主要透過 compiler 直譯出 assembly code, 在這之中 OpenRisc 會定義好最底程的 assemble code map 方式. 而這些 assembly code 必須要符合 OpenRisc 的 CPU 架構 跟 support. 把上層 high level code(c/c++) link 到 底層 structure level 的 assembly code.
在GCC 中用 asm("") 的關鍵字來 link .s 檔.底下分成 Basic, External 來介紹
Basic inline assembly
asm ("movl %eax, %ebx");
asm ("xorl %ebx, %edx");
asm ("movl $0, _booga");
用 "*.s" support 下,最 base 的方式來做. 自己刻出所要的 function.
Extended inline assembly
asm ( "statements" :
output_registers :
input_registers :
clobbered_registers);
用External Base 的方式, 把一些基本的 assembly code merge 成一個大的 assembly code.運用特殊 Register 或者是額外的硬體架構來簡化其敘述跟定義.
Ex:
asm ("leal (%0,%0,4), %0"
: "=r" (x)
: "0" (x) );
用 "leal" 的方式來簡化流程, 不需透過 pointer 到 Memory,確定好 SPI, 在從 MEM 抓 Data 在存到 Register 中,做完運算後在存回記憶體, 最後在釋放 SPI.
x -> %0
%0 + 4 -> %0
%0 -> x
Ref: 可以參考
1. Intel && AT&T 在 assemble 上的定義
Register naming:
AT&T : %eax
Intel : eax
Source/Destination Ordering:
AT&T: movl %eax, %ebx
Intel: mov ebx, eax
Constant value/immediate value format:
AT&T: movl $_booga, %eax
Intel: mov eax, _booga
Operator size specification:
AT&T: movw %ax, %bx
Intel: mov bx, ax
Referencing memory:
AT&T: immed32(basepointer,indexpointer,indexscale)
Intel: [basepointer + indexpointer*indexscale + immed32]
Using Assembly Language in Linux.
Brennan's Guide to Inline Assembly
2. x86 assembly language
x86 assembly language
3. x86 instruction set
x86 Instruction set
底下是在OpenRisc中,定義的新 function, 我們可以 call "putc()" 的方式, 藉由 cross compiler, compile 出符合 OpenRisc 可運行的 assembly code.
1. Push PI, 紀錄 PC(program counter) 位置
2. run function
3. Pop PI, 把 PC(program counter) 釋放回去
.proc _putc
.global _putc
.type _putc, @function
_putc:
# gpr_save_area 0 vars 0 current_function_outgoing_args_size 0
l.addi r1,r1,-4
l.sw 0(r1),r2
l.addi r2,r1,4
l.addi r3,r3,0
l.nop 4
l.lwz r2,0(r1)
l.jr r9
l.addi r1,r1,4
.size _putc, .-_putc
.align 4
.proc _prints
.global _prints
.type _prints, @function
可參考 OpenRisc user manual,
有 SPR(special purpose register), GPRS(general purpose register), 和 instruction definition
Ref:
Developers reference manual for Or1ksim 0.3.0
c compiler 簡體
回覆刪除http://hi.chinaunix.net/?uid-483016-action-viewspace-itemid-44444