[ CnUnix ] in KIDS 글 쓴 이(By): leesl (Nara) 날 짜 (Date): 2006년 2월 7일 화요일 오후 03시 39분 10초 제 목(Title): Re: [질] 64bit inline assembly, bitops.h 첫번째 에러는 test64.c(34): error: asm operand has no constraint letter :"" (0ULL), "1" ((size + 63) >> 6), "2" (addr), "3" (-1ULL), ^ -34 :"" (0ULL), "1" ((size + 63) >> 6), "2" (addr), "3" +34 :"0" (0ULL), "1" ((size + 63) >> 6), "2" (addr), "3" 명시적으로 "0"을 넣으시면 될것 같습니다. 두번째 에러는 다음과 같은데 여기서 test64.c(35): error: expected an asm operand [addr] "r" (addr) : "memory"); [변수]지정하는 방식은 gcc 3.2.1부터인가 사용된 것 같습니다. 따라서 컴파일러를 gcc로 바꾸어 해보시거나 32비트처럼 ebx로 로드해서 사용해도 될 것 같습니다. 그럴려면 -35 [addr] "r" (addr) : "memory"); +35 "b" (addr) : "memory"); 로 수정하고 -30 "1: subq %[addr],%%rdi\n" +30 "1: subq %%rbx,%%rdi\n" 와 같이 하면 될듯한데 amd64가 없어 테스트해보지는 못했습니다. find_first_zero_bit()함수는 다음과 같이 C로 표현할 수 있으니 이를 고려하여 어셈에 적용하면 될 듯합니다. (Kerninghan & Ritchie C책의 getbits() 함수 비슷한 방법) int my_find_first_zero_bit(unsigned long *p, int size) { int b; for (b = 0; b < size; b += 32) { if (p[b >> 5] != ~0) { for (;;) { if ((p[b >> 5] & (1 << (b & 0x1f))) == 0) return b; b++; } } } return size; } |