Pergunta

Eu entendo que escrever qualquer coisa na montagem, ou a adição de montagem para qualquer programa prejudica a sua portabilidade. Mas, quão ruim? Quero dizer, basicamente, todos os PC são x86 ou x64 estes dias, certo? Então, se eu incorporar montagem em um programa C, por que não ainda compilar não importa onde ele foi?

Será que essa noção de não-portabilidade apenas se referir a quando você realmente cavar para as peculiaridades específicas de um processador específico, para espremer cada gota de desempenho a partir de um pedaço de código?

O jogo PC "Roller Coaster Tycoon" foi escrito quase inteiramente em linguagem assembly se bem me lembro. Então ... Como un-portably poderia realmente ser?

Foi útil?

Solução

Além do próprio processador, há, é claro, sempre outras considerações: quais são as convenções de chamada em sua plataforma de destino? Como são valores struct passado para outros (dizem: API)? Que o registo pode ser derrotado pelo receptor? Que são garantidos para ser preservado para o chamador? Como fazer uma chamada de sistema? Qual é o layout de memória preparado para você pela OS após início do processo?

Outras dicas

Portando montagem, há também o problema da ABI, que varia de sistema operacional para OS. Portando um programa C do UNIX para Windows (ou mesmo do Linux para o OpenBSD) pode ser uma recompilação simples, mas para um programa de montagem, você pode descobrir que algumas callee-save registros se tornar chamador-salvar, ou que os parâmetros de ponto flutuante são passou de forma diferente.

E isso não é apenas teórica, viz. registrador R2 das versões PowerPC de Linux e Mac OS X. Na prática, o problema pode não ser tão ruim, por exemplo AMD publicou um ABI "recomendado", ao mesmo tempo que seu conjunto de instruções de 64 bits.

Se você acha que "PC == Windows", em seguida, adicionando assembler para um programa C não dói muito. Se você entrar no mundo Unix, você terá lotes de diferentes CPUs: PPC no PS3 ou Xbox, Macs antigos e muitos servidores poderosos. Para muitos dispositivos pequenos, você terá ARM. dispositivos embarcados (que representam a grande maioria das CPUs instalado hoje) costumam usar a sua própria CPU personalizada com um conjunto de instruções especiais.

Assim, enquanto muitos PCs de hoje será capaz de executar código Intel, que representa apenas uma pequena fração de todas as CPUs lá fora.

Dito isto, código x86 não é sempre o mesmo, também. Há duas razões principais para código de montagem: Você precisa acessar recursos especiais (como registros de interrupção) ou você deseja otimizar o código. No primeiro caso, o código é bastante portátil. Neste último caso, cada CPU é um pouco diferente. Alguns deles têm SSE . Mas SSE foi logo substituído com SSE2 que foi substituído com SSE3 e SSE4. AMD tem sua própria marca. Em breve, haverá AVX. No nível opcode, cada um deles tem tempo ligeiramente diferente nas várias versões de CPUs.

Para piorar as coisas, alguns opcodes tem bugs corrigidos em revisões específicas de uma CPU. Além disso, alguns opcode é muito mais rápido em determinadas versões do CPUs do que em outros.

Em seguida, você vai precisar para fazer a interface este código de montagem com a parte C. Isso normalmente significa que você quer necessidade de lidar com ABI questões.

Assim você pode ver que isso pode se tornar arbitrariamente complexa.

montagem está escrevendo instrução diretamente para um processador específico, o que significa yeaah se os x86 viver para sempre o seu código é de alguma forma portátil.

Mas mesmo agora o processador ARM estão voltando (ou seja próxima geração contábil líquido) e tenho a certeza se o processador não vai mudar no próximo ano.

Eu diria linguagem assembly é por design não portátil.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top