CnUnix

[알림판목록 I] [알림판목록 II] [글목록][이 전][다 음]
[ 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;
}
[알림판목록 I] [알림판목록 II] [글 목록][이 전][다 음]
키 즈 는 열 린 사 람 들 의 모 임 입 니 다.