문제

나는 어셈블리 언어를 처음 접했다. GCC는 MSVC와 마찬가지로 intrin.h에 _bittestandset 함수가없는 것 같습니다. 그래서 나는 새로운 것을 구현했습니다. 이것은 Linux에서 잘 작동하지만 Winvista Machine의 Mingw에 문제가 있습니다. 코드는 다음과 같습니다.

inline unsigned char _bittestandset(unsigned long * a, unsigned long b)
{
    __asm__ ( "bts %1, %[b]"
          : "=g"(*a)
          : [b]"Ir"(b), "g"(*a) );
    return 0;
}
도움이 되었습니까?

해결책

작동하지 않는 것이 무엇인지 설명해 주시겠습니까? 아마도 사용의 간단한 예일 것입니다. 코드에 무엇이 잘못되었는지 추측하기가 어렵습니다 ..

지금까지 치즈처럼 보이는 한 가지 : 비트 테스트 opcode를 실행하지만 결과를 무시합니다. 테스트 (및 세트)가 Opcode 이후 캐리 플래그에서 끝납니다.

결과를 얻으려면 다른 출력 레지스터에 캐리 플래그를 가져 오려면 추가 명령이 필요합니다. (SBB EAX, EAX 또는 그와 비슷한 것).

그렇지 않으면 - 결과가 필요하지 않으면 BTS 명령을 3 개의 간단한 어셈블러 opcodes로 바꾸는 것이 훨씬 저렴합니다.

이 라인을 따라 무언가 :

  ; bit-index in cl
  ; Value in ebx
  ; eax used as a temporary (trashed)
  mov eax, 1
  shl eax, cl
  or  ebx, eax

간단한 테스트 케이스의 어셈블리 출력을 실행하는 정확한 버전이있는 mingw가 없기 때문에 무엇이 잘못되고 있는지 단서를 줄 수 있습니다.

다른 팁

BTS 명령을 사용하지 마십시오. 끔찍하게 느립니다. 더 나은 방법은 Simple Shift+OR을 사용하여 구현하는 것입니다. 그리고 보너스로서, 당신은 어셈블리없이 순수하고 휴대용 C ++로 그것을 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top