AT & T와 비교 한 인텔 어셈블리 구문의 한계 [닫힘]


88

나에게 인텔 구문은 훨씬 읽기 쉽습니다. 인텔 구문에만 집중하는 어셈블리 포리스트를 탐색하면 놓친 것이 있습니까? AT & T로 전환하고 싶은 이유가 있습니까 (다른 사람의 AT & T 어셈블리를 읽을 수있는 것 외에)? 내 첫 번째 단서는 gdb가 기본적으로 AT & T를 사용한다는 것입니다.

이것이 중요하다면, 내 초점은 모든 관계 어셈블리와 구문이 Linux / BSD 및 C 언어에있을 수 있습니다.


11
나는 50 개 이상의 찬성표를 얻는 비 건설적인 질문을 좋아합니다.

답변:


80

하나는 다른 것보다 이점이 없습니다. Intel 구문이 훨씬 읽기 쉽다 는 데 동의합니다 . AFAIK, 모든 GNU 도구에는 Intel 구문을 사용하는 옵션도 있습니다.

다음과 같이 GDB가 Intel 구문을 사용하도록 할 수 있습니다.

분해 풍미 정보 설정

GCC는 -masm=intel.


18
또한, echo set dis intel >> ~ / .gdbinit
oevna 2009-06-09

9
AT & T 구문의 가독성이 떨어지는 이유는 무엇입니까? 피연산자에 크기 접미사가 "dword"보다 더 간결하다는 것을 알았습니다. 내가 놓친 다른 것이 있습니까?
Hawken 2012 년

54
lea -0x30(%rcx,%rax,8),%eax에 대해 복잡한 ATT입니다 lea eax,[rcx+rax*8-0x30]. + 및 *를 사용하면 인텔 스타일에 정말 도움이됩니다.
jørgensen

9
나는 그들의 "컨볼 루션"이 동일하지만 동일하지 않다고 본다. ATT가 불투명하다면 인텔은 모호하다. 중위 산술은 대수학 학생에게 더 친숙하지만, 연산에 정확히 4 개의 인수가 있는지 또는 그중 하나만 곱할 수 있는지 구문에서 명확하지 않으며 두 경우 모두 곱셈기가 a 2의 거듭 제곱
bug

10
내가 훨씬 더 인텔의 "PTR"이외의 AT & T의 접미사를 찾을 @Hawken 당신은 항상 그것을 지정할 수 있기 때문에 S와는 정말 (나를 위해 적어도) 실수의 양을 줄일 수 있습니다. 나머지에 대해서는 (예 : $ 및 % 기호) .. 예 .. 그들은 즐겁지 않고 그게 요점이지만 장점이 있습니다. 명확하고 실수를 다시 한 번 줄입니다. 하나는 읽기에 편하고 (인텔), 다른 하나는 쓰기에 편하다 (AT & T).
MasterMastic

43

GNU 어셈블러 (GAS)의 기본 구문은 AT & T입니다. 인텔 구문은 비교적 새로운 추가 기능입니다. Linux 커널의 x86 어셈블리는 AT & T 구문입니다. Linux 세계에서는 일반적인 구문입니다. MS 세계에서는 Intel 구문이 더 일반적입니다.

개인적으로 저는 AT & T 구문을 싫어합니다 . Intel 구문을 지원하는 GAS와 함께 많은 무료 어셈블러 (NASM, YASM)가 있으므로 Linux에서 Intel 구문을 수행하는 데 문제가 없습니다.

그 외에도 구문상의 차이 일뿐입니다. 둘 다 결과는 동일한 x86 기계어 코드입니다.


25
동의하고 동의했습니다. AT & T 구문을 사용하는 것은 범죄 여야합니다. 반 직관적이고 추악합니다. 왜 모든 단일 번호에 접두사를 붙이고 $ 및 %로 등록하고 역 SIB 표기법으로 상대 주소 지정을 지정해야합니까? 저는 Intel 구문을 다음과 같이 사용했습니다. 2 년이 지났지 만 여전히 AT & T가 존재하는 이유를 알 수 없습니다.
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳

11
굵게 표시하려면 적어도 인텔이 훨씬 더 나은 이유에 대한 증거를 제공하십시오 .
Hawken 2012 년

8
@Hawken 싫은 거 싫어
군터 Piez에게

8
@Hawken 당신은 그가 굵은 글씨체를 사용했기 때문에 그가 단순히 굵은 글씨를 내버려 두었다면 그가 아니었을 방식으로 자신의 의견을 사실로 진술하고 있다고 제안 하는가? 질문은 어쨌든 이런 종류의 의견 주도의 "토론"을 실질적으로 초청하는 것이 었습니다. 아마도 왜 지금은 종결 되었는가!
Elliott

1
ARM 용 인텔 구문은 어떻습니까?

33

하나는 다른 것보다 이점이 없습니다. 인텔의 구문은 훨씬 더 쉽게 읽을 수 비록 개인적 때문에, 동의 내가 인텔 구문을 싫어한다 . 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 구문을 싫어하지 않고 상관하지 않습니다.


19
나는 몹시 혼란 스럽습니다. at & t 구문이 단어 크기를 명시 적으로 만들 필요가 없다는 것을 의미합니까? 내 예제를 복사하고 단어 크기와 쓸모없는 PTR을 추가 한 이유는 무엇입니까? 또한 왜 내 차이를 음수 왼쪽 피연산자가있는 합계로 변경 했습니까? 그것이 명령이 실제로 인코딩되는 방식이기 때문입니까? 사용자는 그것에 대해 정말로 신경 쓸 필요가 거의 없습니다. 내가 사용한 모든 어셈블러에서 왼쪽 피연산자는 32 비트이고 오른쪽 피연산자는 주위에 대괄호가 있으므로 DWORD PTR을 생략 할 수 있습니다.
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳

12
게다가 IDA / ollydbg는 여러분이 작성한 것과 같은 것을 생성하지도 않기 때문에 기계 코드에서 "멋진"인텔 구문으로가는 데 문제가 없다고 확신합니다. 따라서 귀하의 예제는 어셈블러 또는 디스어셈블러의 가장 사소한 구현을 제외하고는 결코 볼 수 없었던 것 같습니다. 반면에, 내가 모의 at & t 지침은 at & t 구문을 가르치는 튜토리얼의 첫 번째 단락 중 하나에서 직접 가져온 것입니다.
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳

8
나는 당신이 기계라는 결론에 이르렀 기 때문에 명령어의 비트 인코딩을 직접 미러링하는 구문을 선호합니다. (at & t 구문이하는 일입니다). 나는 또한 사람들이 기분이 의심이 많은 1337 그들은에서 사용할 때 & T 문법 즉 ... 정말 장점하지 비록 그것이 더 애매한 이후
L̳o̳̳n̳̳g̳̳p̳o̳̳k̳̳e̳̳

7
@Longpoke 아니요, AT & T 구문은 문맥에서 명확하다면 단어 크기를 명시 적으로 만들 필요가 없습니다. intel과 동일 : SOMEWORD PTR[]피연산자 크기가 컨텍스트에서 명확하면 필요하지 않습니다 . 그러나 즉시 메모리 위치로 이동할 경우 필요합니다 (모두 lAT & T에서 인텔의 DWORD PTR). 그리고 예, 제 예는 꽤 고안된 것입니다.하지만 당신의 예도 그렇습니다. 여전히 이유를 알 수없는 경우 : 인텔에서 불필요한 단어는 생략했지만 AT & T에 있습니다. 피연산자는 Intel에서 잘 정렬되도록하는 방식으로 선택하지만 AT & T에서는 선택하지 않습니다.
Gunther Piez

7
그래서 당신은 -4(ebp,edx,4)일이 더 낫다는 [4*edx+ebp-4]말입니까? 후자가 더 직관적이라고 생각합니다.
Calmarius

24

동일한 기계 코드로 컴파일되고 동일한 opcode를 갖는다는 점에서 "동일한 언어"입니다. 반면에 GCC를 사용한다면 AT & T 구문을 배우고 싶을 것입니다. 기본값-컴파일러 옵션 등을 변경하지 않고 가져옵니다.

나도 Intel-syntax x86 ASM (DOS에서도)에 대해 이빨을 자르고 C / UNIX로 전환 할 때 처음에는 더 직관적이라는 것을 알았습니다. 하지만 일단 AT & T를 배우면 쉽게 보일 것입니다.

그렇게 많이 생각하지는 않겠습니다. 인텔을 알게되면 AT & T를 배우는 것은 쉬우 며 그 반대도 마찬가지입니다. 실제 언어는 구문보다 머리 속에 들어가기가 훨씬 더 어렵습니다. 그러니 반드시 하나에 집중하고 다른 하나가 나올 때 배우십시오.


16
뭐? GCC는 기본적으로 at & t를 사용하기 때문에 at & t 구문을 배울 이유가 없습니다. 특히 더 직관적 인 Intel 구문으로 전환 할 수있을 때 더욱 그렇습니다.
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳

7
@longpoke 모든 사람들이 "보다 직관적"이라고 부르기 때문에 인텔 구문을 배우는 것은 그다지 좋은 이유가 아닙니다. 사실 전혀 이유가 없습니다.
Hawken 2012 년

1
Verilog와 VHDL이 모두 붙어있는 것과 같은 이유로 둘 다 정확합니다.
버그

@Hawken : 맞습니다. 인텔 구문을 배우는 진짜 이유는 그것이 인텔과 AMD의 매뉴얼이 사용하는 것입니다. 공급 업체 설명서처럼 AT & T 구문을 사용하는 ISA 참조 설명서는 없습니다 ( 예 : felixcloutier.com/x86/cmppd (인텔의 PDF에서 발췌)). 또한 uops.infoagner.org/optimize 와 같은 성능 정보 . 일부 유닉스 벤더가 어느 시점에서 AT & T ISA 레퍼런스를 만들었다 고 읽었지만 지금은 확실히 구식이며 AVX 지침을 다루지 않을 것입니다. 100 %는이 대답에 동의했습니다. 동일한 기계 코드, 표현을위한 다른 구문, 별거 아니 었습니다.
Peter Cordes

20

사용중인 모든 것에 기꺼이 적응할 의사가 있다는 것은 전문성의 표시입니다. 둘 중 하나에 실질적인 이점이 없습니다. 인텔 구문은 Microsoft 세계에서 일반적이며 AT & T는 Linux / Unix의 표준입니다. 어느 쪽에게도 이점이 없기 때문에 사람들은 처음 본 것이 무엇이든 각인하는 경향이 있습니다. 즉, 전문 프로그래머는 그런 것 이상을 제기합니다. 직장이나 작업중인 도메인에서 사용하는 모든 것을 사용하십시오.


5
도구의 "전문적인"사용자가되고 생산성을 높이기 위해 도구를 변경하는 방법을 아는 것은 어떻습니까? 인텔 구문의 경우 +1.
Jonathon Reinhart

5
글쎄요, 비록 제가 인텔 구문을 선호하지만 그는 요점이 있습니다. 예를 들어 기존 AT & T 코드의 유지를 고려하십시오. 두 가지 방법을 모두 아는 데 아무런 해가 없습니다.
Elliott

7
둘 다 배우는 것도 옹호하지만, Devil 's Advocate를 플레이하고 vim을 스크립트로 * .s 파일을 원하는 구문으로 자동 변환 할 수 있다고 제안합니다.
버그

2
인텔 구문이 읽기 쉽기 때문에 인텔 구문이 장점이 있습니다. "레아 EAX, [EAX * 4 + 8]"갖는다 "LEAL 8 (% EAX, 4) % EAX"보다 훨씬 더 대물 가독성
루씨 M. TATO

2
@bug Heh, emacs 철자가
틀 렸습니다

12

인텔 구문은 모든 것을 다룹니다 (어셈블러 / 디 어셈블러가 최신 정크 인텔이 명령어 세트에 추가 된 최신 상태라고 가정). 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]

... 더 복잡한 명령으로 인해 더 복잡해집니다.

'그런가 말했다.


17
아니, 충분하지 않다.
Gunther Piez

2
포스터는 이미 인텔 구문을 선호한다고 밝혔습니다. 그들에게 좋다. 그래서 당신은 누구를 설득하려고합니까?
Hawken 2012

2
@Hawken 답변을 읽을 포스터 뿐만이 아닙니다.
Winger Sendon

나는 그가 dword 길이로 예제를 언급하는 방법을 좋아합니다. 1 바이트 또는 짧은 메모리 피연산자를 작성하십시오.
아제 Brahmakshatriya

2

내 첫 번째 어셈블리 언어는 MIPS 였는데, ATT 구문과 매우 유사하다는 것을 알았습니다. 그래서 저는 ATT 구문을 선호하지만 읽을 수있는 한 그다지 중요하지 않습니다.


3
MIPS 어셈블리는로드 / 저장 강사 주소 형식의 AT & T 구문과 만 유사합니다. 그러나 MIPS는로드 / 저장을위한 단 하나의 간단한 주소 지정 모드를 가지고있는 반면 Intel은 훨씬 더 많은 것을 가지고있어 이것을 더 복잡하게 만듭니다. 고려 lea -0x30(%rcx,%rax,8),%eaxlea eax,[rcx+rax*8-0x30]Jørgensen이 위에 기록했다. 그리고 AT & T와 달리 MIPS는 여전히 다른 모든 형식과 마찬가지로 대상 우선 형식을 사용합니다. 게다가 MIPS 번호 앞에 $를 붙일 필요가없고 MIPS의 등록 이름이 짧기 때문에 AT & T처럼 %를 갖는 것은 그리 불편하지 않습니다
phuclv
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.