Limitações da sintaxe Intel Assembly em comparação com a AT&T [fechado]

88

Para mim, a sintaxe da Intel é muito mais fácil de ler. Se eu for perambular pela floresta de montagem concentrando-me apenas na sintaxe da Intel, vou perder alguma coisa? Há algum motivo para eu querer mudar para a AT&T (além de ser capaz de ler a montagem da AT&T de outras pessoas)? Minha primeira dica é que o gdb usa AT&T por padrão.

Se isso for importante, meu foco é apenas em qualquer relação assembly e sintaxe que possa ter para Linux / BSD e a linguagem C.

Oevna
fonte
11
Eu adoro perguntas não construtivas, recebendo mais de 50 votos positivos.
ceving

Respostas:

80

Não há realmente nenhuma vantagem para um sobre o outro. Eu concordo, porém, que a sintaxe da Intel é muito mais fácil de ler. Lembre-se de que, AFAIK, todas as ferramentas GNU também têm a opção de usar a sintaxe Intel.

Parece que você pode fazer o GDB usar a sintaxe Intel com isto:

definir informações de sabor de desmontagem

O GCC pode fazer sintaxe Intel com -masm=intel.

Zifre
fonte
18
também, echo set dis intel >> ~ / .gdbinit
oevna
9
Como a sintaxe da AT&T é menos legível? Acho que ter sufixos de tamanho em operandos é mais consistente do que ter "dword". Há algo mais que estou perdendo?
Hawken
54
lea -0x30(%rcx,%rax,8),%eaxé ATT complicado para lea eax,[rcx+rax*8-0x30]. O uso de + e * realmente ajuda no estilo Intel.
jørgensen
9
Eu vejo sua "convolução" como igual, mas não idêntica: se a ATT é opaca, então a Intel é ambígua. Embora a aritmética infixo seja mais familiar para os alunos de álgebra, não é óbvio pela sintaxe que existem exatamente 4 argumentos para a operação, ou que apenas um deles pode ser multiplicado, e em nenhum dos casos está claro que o multiplicador deve ser um potência de 2.
bug de
10
@Hawken Acho os sufixos da AT&T muito melhores do que os "ptr" da Intel porque você sempre especifica e realmente reduz a quantidade de erros (pelo menos para mim). Sobre o resto (por exemplo os símbolos $ e%) .. sim .. eles não são agradáveis, e esse é o ponto, mas eles têm uma vantagem: é explícito e mais uma vez reduz os erros. Eu diria que um é confortável para ler (Intel) e o segundo para escrever (AT&T).
MasterMastic
43

A sintaxe primária para o GNU assembler (GAS) é AT&T. A sintaxe da Intel é uma adição relativamente nova a ele. A montagem x86 no kernel Linux está na sintaxe AT&T. No mundo Linux, é a sintaxe comum. No mundo MS, a sintaxe Intel é mais comum.

Pessoalmente, odeio a sintaxe da AT&T . Existem muitos assemblers gratuitos (NASM, YASM) junto com o GAS que também suportam a sintaxe Intel, então não haverá problemas para fazer a sintaxe Intel no Linux.

Além disso, é apenas uma diferença sintática. O resultado de ambos será o mesmo código de máquina x86.

mmx
fonte
25
Acordado e acordado. Deve ser um crime usar a sintaxe AT&T, é contra-intuitivo e feio, por que você iria querer prefixar cada número e registrar com $ e%, e especificar o endereçamento relativo em notação SIB reversa? dois anos e ainda não consigo ver por que a AT&T existe.
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳
11
Se você vai declarar em negrito, pelo menos forneça alguma evidência de por que a inteligência é tão melhor.
Hawken
8
@Hawken Haters vão odiar
Gunther Piez
8
@Hawken Você está sugerindo que porque ele usou letras em negrito, ele está de alguma forma declarando sua opinião como um fato de uma forma que ele não teria feito se simplesmente tivesse deixado o negrito em paz? A questão estava praticamente convidando esse tipo de "debate" baseado em opiniões, provavelmente por que agora está encerrado!
Elliott
1
Que tal a sintaxe Intel para ARM?
ceving
33

Não há realmente nenhuma vantagem para um sobre o outro. Eu discordo que a sintaxe da Intel é muito mais fácil de ler, porque pessoalmente odeio a sintaxe da Intel . Lembre-se de que, AFAIK, todas as ferramentas GNU também têm a opção de usar a sintaxe 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]

... e fica mais complicado com instruções mais complexas

'nuff disse.

PS: Esta resposta existe principalmente para destacar pontos fracos (IMHO) em algumas outras respostas, que na verdade não são respostas, mas opiniões. E é claro que essa resposta na realidade é apenas minha humilde opinião.

PPS: Eu não odeio a sintaxe da Intel, simplesmente não me importo.

Gunther Piez
fonte
19
Estou terrivelmente confuso. Você está sugerindo que a sintaxe at & t nunca precisa tornar o tamanho da palavra explícito? Por que você copiou meu exemplo e adicionou tamanhos de palavras e o PTR inútil? Além disso, por que você mudou minhas diferenças para somas com um operando esquerdo negativo? É porque é assim que a instrução é realmente codificada? O usuário raramente precisa se preocupar com isso. Em cada assembler que usei, você pode omitir o DWORD PTR, já que o operando esquerdo é de 32 bits e o operando direito tem colchetes ao redor dele.
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳
12
Além disso, IDA / ollydbg nem mesmo produz nada parecido com o que você escreveu, então, tenho certeza de que não há problema em ir do código de máquina para a sintaxe Intel "legal". Portanto, seu exemplo parece muito artificial e algo que eu nunca veria, exceto na implementação mais trivial de um montador ou desmontador. Por outro lado, as instruções at & t que simulo são diretamente de um dos primeiros parágrafos de um tutorial que ensina sintaxe at & t.
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳
8
Cheguei à conclusão de que você é uma máquina, então prefere uma sintaxe que espelhe diretamente a codificação de bits da instrução. (que é o que a sintaxe at & t faz). Também suspeito que as pessoas se sentem mais 1337 quando usam a sintaxe at & t, pois é mais obscura, embora isso não seja realmente uma vantagem ...
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳
7
@Longpoke Não, a sintaxe da AT&T não precisa tornar o tamanho da palavra explícito se estiver claro no contexto. Da mesma forma que com intel: você não precisa SOMEWORD PTR[]saber se o tamanho do operando está claro no contexto. Mas você precisa disso no caso de mover um local imediato para um local de memória (tanto o lda AT&T quanto o DWORD PTR da Intel). E sim, meu exemplo é muito artificial - mas o seu também foi. Caso você ainda não veja o porquê: você deixou de fora os tamanhos de palavras desnecessários na Intel, mas os tem na AT&T. Você escolhe os operandos de forma que eles se alinhem bem na Intel, mas não na AT&T.
Gunther Piez
7
Então você está dizendo que -4(ebp,edx,4)coisa é melhor do que [4*edx+ebp-4]? Acho este último mais intuitivo.
Calmarius
24

É a "mesma linguagem", na medida em que compila no mesmo código de máquina, tem os mesmos opcodes, etc. Por outro lado, se você estiver usando GCC, provavelmente vai querer aprender a sintaxe AT&T, só porque é o padrão - sem alterar as opções do compilador, etc. para obtê-lo.

Eu também comecei a trabalhar com Intel-syntax x86 ASM (no DOS também) e achei mais intuitivo inicialmente ao mudar para C / UNIX. Mas, depois de aprender a AT&T, parecerá igualmente fácil.

Eu não pensaria muito nisso --- é fácil aprender AT&T depois que você conhece a Intel, e vice-versa. A linguagem real é muito mais difícil de entrar em sua cabeça do que a sintaxe. Então, por suposto, concentre-se em um e aprenda o outro quando ele surgir.

Jacob B
fonte
16
O que? Como o GCC usa at & t por padrão, não há razão para aprender a sintaxe at & t. Especialmente quando você pode simplesmente mudá-lo para a sintaxe Intel mais intuitiva.
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳
7
@longpoke Aprender a sintaxe intel só porque todo mundo está chamando de "mais intuitiva" não é uma razão muito melhor. Na verdade, não é razão nenhuma.
Hawken
1
Ambos estão corretos, pelos mesmos motivos que o Verilog e o VHDL permaneceram por aí.
bug de
@Hawken: Verdade. A verdadeira razão para aprender a sintaxe da Intel é que ela é usada pelos manuais da Intel e da AMD. Não há manuais de referência ISA usando a sintaxe da AT&T tão detalhada quanto os manuais do fornecedor, por exemplo, felixcloutier.com/x86/cmppd (extraído dos PDFs da Intel). Também informações de desempenho como uops.info e agner.org/optimize . Acho que li que algum fornecedor de Unix fez uma referência AT&T ISA em algum ponto, mas certamente está desatualizado agora e não abordará as instruções AVX. 100% concordaram com esta resposta: mesmo código de máquina, sintaxe diferente para expressá-lo, nada demais.
Peter Cordes,
19

É um sinal de profissionalismo que você está disposto a se ajustar ao que quer que esteja em uso. Não há vantagem real para um ou para outro. A sintaxe intel é comum no mundo da Microsoft, AT&T é o padrão no Linux / Unix. Como não há vantagem para nenhum dos dois, as pessoas tendem a imprimir no que quer que vejam primeiro. Dito isso, um programador profissional eleva-se acima de coisas assim. Use tudo o que eles usam no trabalho ou no domínio em que você está trabalhando.

phorgan1
fonte
5
Que tal ser um usuário "profissional" das ferramentas e saber como alterá-las para torná-lo mais produtivo? 1 para sintaxe Intel.
Jonathon Reinhart
5
Bem, embora eu também seja a favor da sintaxe da Intel, ele tem razão - considere a manutenção do código AT&T existente, por exemplo. Definitivamente, não há mal nenhum em saber como se virar em ambos.
Elliott
7
Embora eu também recomende o aprendizado de ambos, vou bancar o Devil's Advocate e sugerir que você pode simplesmente fazer o script do vim convertendo automaticamente os arquivos * .s para a sintaxe de sua escolha.
bug de
2
como a sintaxe intel é mais fácil de ler, a sintaxe intel tem uma vantagem. "lea eax, [eax * 4 + 8]" tem legibilidade objetiva muito melhor do que "leal 8 (,% eax, 4),% eax"
Lucio M. Tato
2
@bug Heh, você digitou emacs incorretamente; D
GDP2
13

A sintaxe da Intel cobre tudo (assumindo que o montador / desmontador está atualizado com o mais recente lixo da Intel adicionado ao conjunto de instruções). Tenho certeza que at & t é o mesmo.

at & t intel
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]

... e fica mais complicado com instruções mais complexas

'nuff disse.

L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳
fonte
17
Não, não disse o suficiente.
Gunther Piez
2
O autor da postagem já afirmou que eles preferem sintaxe intel; bom para eles; então quem você está tentando convencer?
Hawken
2
@Hawken não é apenas o autor da postagem que vai ler as respostas.
Winger Sendon
Eu gosto de como ele menciona o exemplo com comprimento de dword. Escreva um operando de memória em um byte ou curto.
Ajay Brahmakshatriya de
2

Minha primeira linguagem assembly foi MIPS, que notei ser muito semelhante à sintaxe ATT. Portanto, prefiro a sintaxe ATT, mas isso realmente não importa, contanto que você possa lê-la.

gsk
fonte
3
O assembly MIPS só é semelhante à sintaxe da AT&T no formato de endereço das instruções de carregamento / armazenamento. Mas o MIPS tem apenas um modo de endereçamento simples para carregar / armazenar, enquanto a Intel tem muito mais, o que torna isso mais complexo. Considere lea -0x30(%rcx,%rax,8),%eaxe lea eax,[rcx+rax*8-0x30]jørgensen postado acima. E, ao contrário da AT&T, o MIPS ainda usa o formato de destino em primeiro lugar como todos os outros. Além disso, o número MIPS não precisa ser prefixado por $ e os nomes de registro no MIPS são curtos, então não é muito desconfortável ter% totalmente como AT&T
phuclv