2013-03-12 2 views
1

저는 현재이 대학에서 특정 C/C++ 구조의 배후에있는 어셈블러 코드에 대해 배웁니다.Apple g ++/Visual C++ 같은 GNU g ++ 인라인 어셈블리 블록?

워크 플로는 일반적으로 다음과 같이 진행됩니다. 실험 조교는 주제에 대해 간단히 말하고, 단점을 파악한 다음 인라인 어셈블리를 사용하여 완전히 임의의 문제를 해결합니다.

(예를 들어 그는 잠시 struct이 (회원) 메모리에 저장됩니다, 우리는 패턴을 파악하고 우리는 우리가 struct를 사용하는 간단한 문제에 인라인 어셈블리를 사용하여 솔루션을 작성하는 방법에 대해 이야기합니다.)

실험실 보조원 (나머지 그룹과 마찬가지로)은 논증 때문에 Visual C++ 컴파일러 및 디버거 (디스 어셈블리 용)를 사용하고 있지만 윤리적 인 이유로 사용할 수 없으므로 g++gdb을 선택했습니다. 나는 약 어색 찾을 무엇

g ++의 인라인 어셈블리 비주얼 C++에 비해 사실이다 :

  • 내가 쓰고 싶은 경우 '인라인 어셈블리의 블록을'나는 두 가지 옵션이 있습니다 : 하나의 asm("..") 구조를 가지고는 각 명령어의 앞에는 \n\t (많은 혼란을 야기 함)이 있습니다. 또는 각 명령을 자체적으로 asm("..") 블록으로 만들면 많은 타이핑이 발생합니다.

  • 인라인 어셈블리에서 로컬 변수를 참조하려면 확장 구문을 사용하거나 esp/ebp으로 오프셋을 사용하여 참조해야합니다. 나는 위해 내가 할 일은 __asm { .. } 인 ASM 블록을 작성하고에 새로운 라인에 순서대로 각 명령을 작성하는 비주얼 C++의 인라인 어셈블리 스타일을 선호하는 위의 두 가지 문제에 관련하여

변수를 참조하기 만하면 그 이름을 써야합니다.

내 검색을 통해 Apple의 g++은 Visual C++와 동일한 구문을 스위치 (-fasm-blocks)로 지원하지만 GNU g++의 경우는 그렇지 않은 것으로 나타났습니다.

GNU g++에서 인라인 어셈블리 블록과 같은 Visual C++을 컴파일하는 것이 가능한지 궁금한 점이 있습니다.

+0

Microsoft는 64 비트 프로그램에서 인라인 asm을 지원하지 않으며 어쩌면 그렇게 좋은 생각이 아니 었나요? –

답변

2

참조하는 구문은 Microsoft와 관련이 없습니다. 당신이 알았 듯이, 애플도 그것을 가지고있다. (애플은 GCC를 포기하고 Clang으로 전환했지만). AFAIK, Metrowerks도 같은 구문을 지원합니다. GCC는 그것을 지원하지 않습니다 (아마도 GCC 사람들은 GCC가 너무 좋기 때문에 아무도 더 이상 어셈블리를 작성할 필요가 없다고 생각하기 때문입니다 :-)). 그러나 항상 \n\t을 입력 할 필요가 없습니다. ;으로 바꿀 수 있습니다. 예 :

void foo() 
{ 
    asm("xor %eax,%eax;" 
     "rep; nop;" 
     "nop;" 
     "sfence;" 
     "nop;"); 
} 

희망이 있습니다. 행운을 빕니다!

+0

실제로 그 점이 조금 더 명확 해졌습니다. 감사합니다. 그러나 여전히 입력하는 것이 많습니다. 다른 방법이 없다면 변환기를 쓸 수도 있습니다. –

+0

@ MihaiBişog : 예. 그러나 인라인 어셈블리는 많은 수의 어셈블리 코드를 작성하는 데 사용되지 않았습니다. 실제로 입력하는 것이 많을 수 있습니다.언제나 어셈블리로 작성하고'nasm'과 같은 친숙한 도구를 사용하고 그 오브젝트 파일에 링크 할 수 있습니다. 그게 내가 할 일이다. –