당신은 어셈블리 코드를 작성하는 방법의 아이디어를 gcc를 요청할 수 있습니다 : gcc -S foo.c
또는 gcc -Wa,-alh=foo.s -c foo.c
을. 물론 결과를 향상시킬 수 있습니다. 약간의 추가 작업이 필요합니다 : 어셈블리 덩어리에 전달하는 매개 변수로 %0
을 사용하고 clobbered 한 레지스터를 선언하십시오. 익숙하지 않은 경우 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을 사용)하고 그것으로 계산 된 점프를 만드는;
static register int stack_pointer0 asm("msp0");
void myfn() {
......
saved_stack_pointer = stack_pointer0;
......
}
OK, 아마하지 않습니다 당신은 GCC를 사용하는 가정
__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 '값을 배열에 저장할 수 있습니까? –