Assembly Language - Programar em liguagem baixo nível

Alguem possui boas apostilas para aprendizado da Linguagem Assembly, ou video aulas,

Onde aprender a programar em Assembly?

Masoquismo?

Procure livros de eletrônica digital, e do assembly do 8086. Talvez se procurar por Turbo Assembly (TASM), você também ache material.

Não é masoquismo! Minha idéia ter melhor conhecimento sobre operações com linguagem de baixo nível pois é assim que posso ler os programas que estão rodando em memória RAN, uma pessoa com esses conhecimentos é capaz de operar da forma mais específica possível, além de possuir total controle sobre o computador.

Para fazer alteração em programas é necessário conhecer bem linguagem de baixo nível

Está afim de fazer cracking?

Bem, uma linguagem de mais baixo nível que te dará um bom conhecimento sobre o funcionamento da máquina é o C. Hoje em dia, são pouquíssimos os casos onde não se usa C no lugar de assembly, mesmo no desenvolvimento de hardware. Fora que você poderá brincar com diversas bibliotecas interessantes, como o CUDA, da NVidia.

é uma boa mais quero ter um básico conhecimento de Assembly

Tenho um 3 tutos de Assembly, mais são horríveis, queria uma esplicação melhor sobre a definição de Registradores, como é essa localização em cordenadas de bytes

Olá

Localização, arquitetura e número de registradores tem mais a ver com o processador. Você precisa procurar por livros que abordam o PC e vai achar com mais facilidade para os processadores antigos como o 8086.

O Google em http://www.google.com.br/search?hl=pt-BR&q=8086+programming me indicou este link: http://www.pdf-search-engine.com/assembly-8086-pdf.html

Sobre assembler para PC há alguns excelente livros clássicos tais como:

Advanced M. S.-DOS Programming

MS-DOS Encyclopedia ou http://www.torrentreactor.net/find/ms-dos-encyclopedia

Ainda há um tutorial básico de assembler em http://www.xs4all.nl/~smit/asm01001.htm

Os processadores mais novos tem diferenças nos registradores. Há outros. Mas se entender os básicos fica fácil entender os mais avançados.

PORÉM…

É como o Vini falou. Não se usa mais assembler. Virou um conhecimento inútil. Eu, que já programei muito em assembler, garanto a você que aprender assembler é perda de tempo a menos que vá programar micro controladores. Mesmo o Daniel Quadros http://dqsoft.blogspot.com/ que já escreveu vários livros de assembler usa mais. Os “novos” sistemas operacionais não permitem acesso direto aos registradores sem um monte de trabalho para obter permissão (novos entre aspas porque isto já é assim desde o Windows NT).

Conhecer assembler a fundo não dá melhor conhecimento sobre como um programa é processado porque atualmente uma única linha de Java pode significar milhares de linhas de assembler. Mas se quer conhecer só o básico, então leia o PDF em http://www.csi.ucd.ie/staff/jcarthy/home/alp/alp1.pdf

[]s
Luca

[quote=Luca]Olá

Localização, arquitetura e número de registradores tem mais a ver com o processador. Você precisa procurar por livros que abordam o PC e vai achar com mais facilidade para os processadores antigos como o 8086.

O Google em http://www.google.com.br/search?hl=pt-BR&q=8086+programming me indicou este link: http://www.pdf-search-engine.com/assembly-8086-pdf.html

Sobre assembler para PC há alguns excelente livros clássicos tais como:

Advanced M. S.-DOS Programming

MS-DOS Encyclopedia ou http://www.torrentreactor.net/find/ms-dos-encyclopedia

Ainda há um tutorial básico de assembler em http://www.xs4all.nl/~smit/asm01001.htm

Os processadores mais novos tem diferenças nos registradores. Há outros. Mas se entender os básicos fica fácil entender os mais avançados.

PORÉM…

É como o Vini falou. Não se usa mais assembler. Virou um conhecimento inútil. Eu, que já programei muito em assembler, garanto a você que aprender assembler é perda de tempo a menos que vá programar micro controladores. Mesmo o Daniel Quadros http://dqsoft.blogspot.com/ que já escreveu vários livros de assembler usa mais. Os “novos” sistemas operacionais não permitem acesso direto aos registradores sem um monte de trabalho para obter permissão (novos entre aspas porque isto já é assim desde o Windows NT).

Conhecer assembler a fundo não dá melhor conhecimento sobre como um programa é processado porque atualmente uma única linha de Java pode significar milhares de linhas de assembler. Mas se quer conhecer só o básico, então leia o PDF em http://www.csi.ucd.ie/staff/jcarthy/home/alp/alp1.pdf

[]s
Luca

[/quote]

Vou discordar quanto ao conhecimento inútil. Muitos microcontroladores ainda são programados em assembly, e, para otimização, usar assembly inline em pascal ou c também.

A sintaxe at&t é mais usada em sistemas unix, em conjunto com gcc.
http://sig9.com/articles/att-syntax.

Assembly não é linguagem de programação.

Este livro é muito bom, e é de graça. Pode te dar uma idéia de como usar asm:
http://webster.cs.ucr.edu/AoA/DOS/pdf/0_AoAPDF.html

Detalhe, é inviável utilizar somente assembly. Um intel pentium possui milhares de instruções, então o fato de usar inline ser muito importante.

puxe o microcontrole simulator… e uma ferramenta didatica para auxiliar no aprendizado de assembly…
só depois que vc tiver bem fera no microcontroler simulator passe para o assembly de verdade senão vc vai se bater bastante se começar a estuda-lo direto…
aqui vc puxa o microcrontroler simulator:
http://www.samphire.demon.co.uk/

o help e os exemplos deste são muito bons… procure ver os exemplos e fazer algo parecido de sua maneira…
o bom e vc pegar bem as operações basicas e como trabalhar de forma correta com a memoria e com os registradores…
dai sim passar pro assembly de verdade…

Uma coisa interessante para aprender um pouco de Assembly é tentar entender uma listagem gerada pelo compilador C (o C++ é mais distante da máquina e o compilador gera código muito mais obscuro).
Você vai ver que o compilador aparenta ser mais estúpido que um programador Assembly normal, se você não usar as opções de otimização (principalmente se você usar um compilador antigo e ingênuo como o do Microsoft Visual C++ 6.0).
Mas se você ligar as opções de compilação no máximo, não vai entender quase nada, porque ele começa a usar técnicas complexas de alocação de registros e começa a provar que certas áreas do código nunca serão usadas, portanto nem as compila, ou então gera código equivalente em termos de resultados.

int j = 0;
for (int i = 0; i < 100; ++i) {
   j++;
}

O compilador C, se usarmos as opções de compilação adequadas, transforma o código acima para algo semelhante a:

j = 100;

eu utilizei o compilador picc por muito tempo escrevendo programas para o PIC 18F452.

[quote=juliocbq]
Vou discordar quanto ao conhecimento inútil. Muitos microcontroladores ainda são programados em assembly, e, para otimização, usar assembly inline em pascal ou c também.[/quote]
isso de otimização é lenda. para gerar o código assembly, o próprio compilador c faz estratégias, e avalia as melhores hipóteses. compiladores fazem esse trabalho duro melhor do que pessoas.

[quote=bobmoe][quote=juliocbq]
Vou discordar quanto ao conhecimento inútil. Muitos microcontroladores ainda são programados em assembly, e, para otimização, usar assembly inline em pascal ou c também.[/quote]
isso de otimização é lenda. para gerar o código assembly, o próprio compilador c faz estratégias, e avalia as melhores hipóteses. compiladores fazem esse trabalho duro melhor do que pessoas.[/quote]

Não faz não. O melhor exemplo disso é a função da própria api do windows memcpy. Conseguimos reproduzir uma, duas vezes mais rápida com assembler, no delphi.

Essa função foi escrita inline, no delphi. Conseguiu suprir problemas de performance nesse produto.
http://www.planetapc.com.br/index.asp?secao=2&categoria=15&subcategoria=0&id=403

[quote=juliocbq][quote=bobmoe][quote=juliocbq]
Vou discordar quanto ao conhecimento inútil. Muitos microcontroladores ainda são programados em assembly, e, para otimização, usar assembly inline em pascal ou c também.[/quote]
isso de otimização é lenda. para gerar o código assembly, o próprio compilador c faz estratégias, e avalia as melhores hipóteses. compiladores fazem esse trabalho duro melhor do que pessoas.[/quote]

Não faz não. O melhor exemplo disso é a função da própria api do windows memcpy. Conseguimos reproduzir uma, duas vezes mais rápida com assembler, no delphi.[/quote]
não conheço o delphi (e as limitações dele, pois o compilador deve permitir essas otimizações), mas como eu disse, no gcc eu garanto :wink:

Na Siemens também comprovamos que é possível e mais fácil gerar código otimizado em C do que em assembly. E geralmente, o compilador é muito mais eficiente e disciplinado do que um bom programador.

Claro que exige bastante conhecimento do compilador e a criação de um manual de “boas práticas”, além de sempre trabalhar com as otimizações ligadas.

[quote=ViniGodoy]Na Siemens também comprovamos que é possível e mais fácil gerar código otimizado em C do que em assembly. E geralmente, o compilador é muito mais eficiente e disciplinado do que um bom programador.

Claro que exige bastante conhecimento do compilador e a criação de um manual de “boas práticas”, além de sempre trabalhar com as otimizações ligadas. [/quote]

Mas e se a api do windows não suprir o que você precisa?

Essa função é mais rápida que a da própria api do windows.
Eu não gosto de codificar em assmbly, mas algumas vezes não temos escolha.

function FastAllocMem(ASize: Cardinal): Pointer;
asm
  push ebx
  
  lea ebx, [eax - 1]
  and ebx, -4
 
  call FastGetMem
 
  cmp eax, 1
  sbb ecx, ecx

  lea edx, [eax + ebx]
 
  or ebx, ecx
 
  cmp ebx, MaximumMediumBlockSize - BlockHeaderSize
  jae @Done
 
  neg ebx

  fldz
  
@FillLoop:
  fst qword ptr [edx + ebx]
  add ebx, 8
  js @FillLoop

  mov [edx], ecx
 
  ffree st(0)
@Done:
  pop ebx
  db $f3
end;

Hum… você está usando “fst” que usa o coprocessador aritmético, que por si só é muito lento (mesmo a JVM evita usar o coprocessador e usa, em seu lugar, as instruções SSE2 / SSE3 se for fazer contas com double.
Se for adequar seu código para um processador mais moderno (64 bits), use rep stosq.

É, talvez para pequenas otimizações assim deva valer a pena. Para software no geral, como era o caso dos softwares do telefone, não valia. Até pq nenhum programador consegue manter disciplina sempre. Fora que lá tinhamos bastante controle do hardware pela API do telefone.