2010年6月2日 星期三

compiler design 4 ASM

底下是我在 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

1 則留言:

  1. c compiler 簡體
    http://hi.chinaunix.net/?uid-483016-action-viewspace-itemid-44444

    回覆刪除