原帖由 zylthinking 于 2009-7-31 15:43 发表
经常看到嵌入式汇编直接使用寄存器, 并不保存原内容, 那万一原来内容是有用的怎么办?
这里面有什么约定吗?
比如 int a(){
int b;
asm{
move %%eax, %%ebx;
}
}
诸如此类, ...
原帖由 Cyberman.Wu 于 2009-8-3 20:54 发表
根据ABI的约定,有些寄存器是要调用者保存的,而有些有特定的含义,所以在足够简单时偶尔会直接使用;但这样比较危险的。
个人感觉GCC的嵌入式汇编其实很难用的,原来我在项目中用一个东西折腾了很长时间。后 ...
原帖由 albcamus 于 2009-8-3 22:02 发表
diab在inline asm上,要么全抄gcc,要么是语法模仿。 我曾经写过一个相当复杂的gcc inline asm程序,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) |
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); } |
asm[ volatile] ("string"[ ! register-list]); |
欢迎光临 Chinaunix (http://bbs.chinaunix.net/) | Powered by Discuz! X3.2 |