나에게 인텔 구문은 훨씬 읽기 쉽습니다. 인텔 구문에만 집중하는 어셈블리 포리스트를 탐색하면 놓친 것이 있습니까? AT & T로 전환하고 싶은 이유가 있습니까 (다른 사람의 AT & T 어셈블리를 읽을 수있는 것 외에)? 내 첫 번째 단서는 gdb가 기본적으로 AT & T를 사용한다는 것입니다.
이것이 중요하다면, 내 초점은 모든 관계 어셈블리와 구문이 Linux / BSD 및 C 언어에있을 수 있습니다.
답변:
하나는 다른 것보다 이점이 없습니다. Intel 구문이 훨씬 읽기 쉽다 는 데 동의합니다 . AFAIK, 모든 GNU 도구에는 Intel 구문을 사용하는 옵션도 있습니다.
다음과 같이 GDB가 Intel 구문을 사용하도록 할 수 있습니다.
분해 풍미 정보 설정
GCC는 -masm=intel
.
lea -0x30(%rcx,%rax,8),%eax
에 대해 복잡한 ATT입니다 lea eax,[rcx+rax*8-0x30]
. + 및 *를 사용하면 인텔 스타일에 정말 도움이됩니다.
GNU 어셈블러 (GAS)의 기본 구문은 AT & T입니다. 인텔 구문은 비교적 새로운 추가 기능입니다. Linux 커널의 x86 어셈블리는 AT & T 구문입니다. Linux 세계에서는 일반적인 구문입니다. MS 세계에서는 Intel 구문이 더 일반적입니다.
개인적으로 저는 AT & T 구문을 싫어합니다 . Intel 구문을 지원하는 GAS와 함께 많은 무료 어셈블러 (NASM, YASM)가 있으므로 Linux에서 Intel 구문을 수행하는 데 문제가 없습니다.
그 외에도 구문상의 차이 일뿐입니다. 둘 다 결과는 동일한 x86 기계어 코드입니다.
하나는 다른 것보다 이점이 없습니다. 인텔의 구문은 훨씬 더 쉽게 읽을 수 비록 개인적 때문에, 동의 내가 인텔 구문을 싫어한다 . AFAIK, 모든 GNU 도구에는 Intel 구문을 사용하는 옵션도 있습니다.
at&t noprefix intel
mov eax, -4(ebp,edx,4) mov DWORD PTR[-4 +ebp +edx *4], eax
mov eax, -4(ebp) mov DWORD PTR[-4 +ebp], eax
mov edx, (ecx) mov DWORD PTR[ecx], edx
lea ( ,eax,4), eax lea eax, DWORD PTR[8 + eax*4]
lea (eax,eax,2), eax lea eax, DWORD PTR[eax*2+eax]
... 더 복잡한 명령으로 인해 더 복잡해집니다.
'그런가 말했다.
추신 :이 답변은 주로 다른 답변의 약점을 강조하기 위해 존재합니다. 실제로 답변이 아니라 의견입니다. 물론이 대답은 실제로 내 겸손한 의견 일뿐입니다.
PPS : 저는 Intel 구문을 싫어하지 않고 상관하지 않습니다.
SOMEWORD PTR[]
피연산자 크기가 컨텍스트에서 명확하면 필요하지 않습니다 . 그러나 즉시 메모리 위치로 이동할 경우 필요합니다 (모두 l
AT & T에서 인텔의 DWORD PTR). 그리고 예, 제 예는 꽤 고안된 것입니다.하지만 당신의 예도 그렇습니다. 여전히 이유를 알 수없는 경우 : 인텔에서 불필요한 단어는 생략했지만 AT & T에 있습니다. 피연산자는 Intel에서 잘 정렬되도록하는 방식으로 선택하지만 AT & T에서는 선택하지 않습니다.
-4(ebp,edx,4)
일이 더 낫다는 [4*edx+ebp-4]
말입니까? 후자가 더 직관적이라고 생각합니다.
동일한 기계 코드로 컴파일되고 동일한 opcode를 갖는다는 점에서 "동일한 언어"입니다. 반면에 GCC를 사용한다면 AT & T 구문을 배우고 싶을 것입니다. 기본값-컴파일러 옵션 등을 변경하지 않고 가져옵니다.
나도 Intel-syntax x86 ASM (DOS에서도)에 대해 이빨을 자르고 C / UNIX로 전환 할 때 처음에는 더 직관적이라는 것을 알았습니다. 하지만 일단 AT & T를 배우면 쉽게 보일 것입니다.
그렇게 많이 생각하지는 않겠습니다. 인텔을 알게되면 AT & T를 배우는 것은 쉬우 며 그 반대도 마찬가지입니다. 실제 언어는 구문보다 머리 속에 들어가기가 훨씬 더 어렵습니다. 그러니 반드시 하나에 집중하고 다른 하나가 나올 때 배우십시오.
사용중인 모든 것에 기꺼이 적응할 의사가 있다는 것은 전문성의 표시입니다. 둘 중 하나에 실질적인 이점이 없습니다. 인텔 구문은 Microsoft 세계에서 일반적이며 AT & T는 Linux / Unix의 표준입니다. 어느 쪽에게도 이점이 없기 때문에 사람들은 처음 본 것이 무엇이든 각인하는 경향이 있습니다. 즉, 전문 프로그래머는 그런 것 이상을 제기합니다. 직장이나 작업중인 도메인에서 사용하는 모든 것을 사용하십시오.
인텔 구문은 모든 것을 다룹니다 (어셈블러 / 디 어셈블러가 최신 정크 인텔이 명령어 세트에 추가 된 최신 상태라고 가정). at & t가 동일하다고 확신합니다.
at & t 인텔 movl -4 (% ebp, % edx, 4), % eax mov eax, [ebp-4 + edx * 4] movl -4 (% ebp), % eax mov eax, [ebp-4] movl (% ecx), % edx mov edx, [ecx] leal 8 (, % eax, 4), % eax lea eax, [eax * 4 + 8] leal (% eax, % eax, 2), % eax lea eax, [eax * 2 + eax]
... 더 복잡한 명령으로 인해 더 복잡해집니다.
'그런가 말했다.
내 첫 번째 어셈블리 언어는 MIPS 였는데, ATT 구문과 매우 유사하다는 것을 알았습니다. 그래서 저는 ATT 구문을 선호하지만 읽을 수있는 한 그다지 중요하지 않습니다.
lea -0x30(%rcx,%rax,8),%eax
와 lea eax,[rcx+rax*8-0x30]
Jørgensen이 위에 기록했다. 그리고 AT & T와 달리 MIPS는 여전히 다른 모든 형식과 마찬가지로 대상 우선 형식을 사용합니다. 게다가 MIPS 번호 앞에 $를 붙일 필요가없고 MIPS의 등록 이름이 짧기 때문에 AT & T처럼 %를 갖는 것은 그리 불편하지 않습니다