- 论坛徽章:
- 0
|
原帖由 albcamus 于 2009-8-3 22:02 发表 ![]()
diab在inline asm上,要么全抄gcc,要么是语法模仿。 我曾经写过一个相当复杂的gcc inline asm程序,diab编译、运行都没问题。
你真的确信?哪个版本?Diab编译器是风河买来的,如果你见过它编译生成的指令、C++的对象模型实现等,你就会确信,它和GCC没有任何血源关系;它的优化效果比原来风河采用的GCC 2.96好许多。除非现在风河把它扩展的兼容GCC(这个方便别人移植程序,就好比我现在用的一款编译器,具体实现和GCC没关系,但是兼容了GCC的扩展语法和编译选项),但据我所知的是后来风河在编译开发上投入不多,不应该出现这么大的动静吧。
下面是Diab嵌入汇编的语法:
asm [volatile] [return-type] macro-name ( [ parameter-list ] )
{
% storage-mode-list (must start in column 1)
! register-list (`!' must be first non-whitespace)
asm-code
} (must start in column 1) |
好像和GCC不同吧?下面是手册中的一段示例代码:
asm void semaphore_seize (volatile int *semaphore_p)
{
% reg semaphore_p; lab loop
! "r4", "r5" /* scratch registers used */
addi r4,r0,1 # token for semaphore
loop: # label replaced by compiler
lwarx r5,r0,semaphore_p # semaphore will be in register
cmpi cr0,0,r5,0 # semaphore free?
bne loop # branch if no
stwcx. r4,r0,semaphore_p # store token in semaphore
bne loop # in case interrupted before stwcz.
}
#pragma section CONTROL far-absolute RW address=0xf0000
#pragma use_section CONTROL mem_semaphore
volatile int mem_semaphore;
void seize (volatile int *reg_semaphore_p)
{
semaphore_seize (reg_semaphore_p);
semaphore_seize (& mem_semaphore);
}
|
它比较方便的就是这种宏块机制,参数类似传参数的方式和C变量结合,个人感觉比GCC的方式要直观一些。
当然它也有asm string方式:
asm[ volatile] ("string"[ ! register-list]); |
不过和GCC还是有区别的。 |
|