你可以問的gcc其如何編寫代碼彙編的想法:gcc -S foo.c
或gcc -Wa,-alh=foo.s -c foo.c
。當然,您可能想要改進結果。您需要做一些額外的工作:使用%0
作爲傳遞給裝配體塊的參數,並聲明已經破壞的寄存器。如果你不熟悉,請查閱Assembler Instructions with C Expression Operands in the GCC manual。這可能是這樣的(警告,直接輸入瀏覽器,並且不知道x86彙編語法)。
#define SAVE_STACK_POINTER(tid) __asm__ __volatile__ (" \
cmpl $0, %0 \n\
je .SAVE_STACK_POINTER_0 \n\
cmpl $1, %0 \n\
je .SAVE_STACK_POINTER_1 \n\
cmpl $2, %0 \n\
je .SAVE_STACK_POINTER_2 \n\
cmpl $3, %0 \n\
je .SAVE_STACK_POINTER_3 \n\
jmp .SAVE_STACK_POINTER_done \n\
.SAVE_STACK_POINTER_0: \n\
movq %%rsp, msp0 \n\
movq ts0, %%rsp \n\
jmp SAVE_STACK_POINTER_done \n\
.SAVE_STACK_POINTER_1: \n\
movq %%rsp, msp1 \n\
movq ts1, %%rsp \n\
jmp SAVE_STACK_POINTER_done \n\
.SAVE_STACK_POINTER_2: \n\
movq %%rsp, msp2 \n\
movq ts2, %%rsp \n\
jmp SAVE_STACK_POINTER_done \n\
.SAVE_STACK_POINTER_3: \n\
movq %%rsp, msp3 \n\
movq ts3, %%rsp \n\
.SAVE_STACK_POINTER_done: \n\
" : : "r" (tid))
票友方法將涉及找出多少字節每movq
- movq
- jmp
塊需要(注:我沒有檢查,我使用8),使一個計算跳了進去;像
__asm__(" \n\
movl %0, %eax \n\
mul 8, %eax \n\
add 4, %eax \n\
jmp . + %eax \n\
movq %%rsp, msp0 \n\
movq ts0, %%rsp \n\
jmp .SAVE_STACK_POINTER_done \n\
…
.SAVE_STACK_POINTER_done: \n\
" : : "r" (tid) : "%eax")
tid是一個運行時值,而不是像n那樣的常量。 – MetallicPriest
(不要緊,這是無稽之談。) –
是否可以將'tsp'和'msp '的值存儲在數組中? –