



Estude fácil! Tem muito documento disponível na Docsity
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Prepare-se para as provas
Estude fácil! Tem muito documento disponível na Docsity
Prepare-se para as provas com trabalhos de outros alunos como você, aqui na Docsity
Encontra documentos específicos para os exames da tua universidade
Prepare-se com as videoaulas e exercícios resolvidos criados a partir da grade da sua Universidade
Responda perguntas de provas passadas e avalie sua preparação.
Ganhe pontos para baixar
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Aula 1 do curso de assembly por bruno diego da silva. Aprenda sobre a organização da memória em segmentos e o cálculo de endereços físicos.
Tipologia: Notas de estudo
1 / 5
Esta página não é visível na pré-visualização
Não perca as partes importantes!




³ þ Curso de Assembly þ Aula N° 01 ³ ÔÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ;
Por: Bruno Diego da Silva
ÕÍÍÍÍÍÍÍÍÍÍÍ͸ ³ ASSEMBLY I ³ ÔÍÍÍÍÍÍÍÍÍÍÍ;
0 0 A linguagem ASSEMBLY (e n8 4 o assemblER!) d medo em muita gente! 0 0 8 4
0 0 S¢ n o sei porque! As liguagens ditas de "alto n¡vel" s8 4 o MUITO mais complexas que o assembly! O programador assembly tem que saber, antes de mais nada, como est organizada a mem¢ria da m quina 0 0 em que trabalha, a disponibilidade de rotinas pr8 2 -definidas na ROM do micro (que facilita muito a vida de vez em quando!) e os demais recursos que a m quina oferece.
0 0 8 7
0 0 Uma grande desvantagem do assembly com rela 0 0 (^) 8 4o as outras 8 2
0 0 linguagens que n8 4 o existe tipagem de dados como, por exemplo, ponto-flutuante... O programador ter que desenvolver as suas 0 0 pr¢prias rotinas ou lan8 7 ar mao do co-processador matem tico (o TURBO ASSEMBLER, da Borland, fornece uma maneira de emular o 0 0 8 4
0 0 8 7
0 0 co-processador). N o existem fun (^) 9 4es de entrada-sa¡da como PRINT do 0 0 BASIC ou o Write() do PASCAL... N 0 0 8 4 o existem rotinas que imprimam
8 2
0 0 dados num ricos ou strings na tela... Enfim... n8 4 o existe nada de £til! (Ser ?! hehehe)
0 0 8 4
0 0 8 2
0 0 Pra que serve o assembly ent o? A resposta : Para que voc8 8 possa desenvolver as suas pr¢prias rotinas, sem ter que topar com 0 0 8 7
0 0 bugs ou limita (^) 9 4es de rotinas j existentes na ROM-BIOS ou no seu compilador "C", "PASCAL" ou qualquer outro... Cabe aqui uma 0 0 8 7
0 0 8 4
0 0 considera o interessante: (^) 9 0 muito mais produtivo usarmos uma liguagem de alto n¡vel juntamente com nossas rotinas em assembly... 0 0 8 7
0 0 8 4
0 0 Evita-se a "reinven o da roda" e n8 4 o temos que desenvolver TODAS as rotinas necess rias para os nossos programas. Em particular, o 0 0 8 2
0 0 assembly muito £til quando queremos criar rotinas que n8 4 o existem na liguagem de alto-n¡vel nativa! Uma rotina ASM bem desenvolvida pode nos dar a vantagem da velocidade ou do tamanho mais reduzido em nossos programas.
0 0 O primeiro passo para come 0 0 8 7 ar a entender alguma coisa de assembly 0 0 (^) 8 2entender como a CPU organiza a mem¢ria. Como no nosso
8 2
0 0 caso a id ia (^) 8 2entender os microprocessadores da fam¡lia 80x86 da Intel (presentes em qualquer PC-Compat¡vel), vamos dar uma olhadela no modelamento de mem¢ria usado pelos PCs, funcionando sob o MS-DOS (Windows, OS/2, UNIX, etc... usam outro tipo de modelamento... MUITO MAIS COMPLICADO!).
0 0 8 7
0 0 ³ Modelamento REAL da mem¢ria - A segmenta (^) 8 4o ³ ÔÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ;
0 0 A mem¢ria de qualquer PC (^) 8 2dividida em segmentos. Cada segmento tem 64k bytes de tamanho (65536 bytes) e por mais estranho que 0 0 8 7
0 0 8 4
0 0 pare a os segmentos n o s8 4 o organizados de forma sequencial 0 0 8 4
0 0 (o segmento seguinte n 0 0 o come8 7 a logo ap¢s o anterior!). Existe uma sobreposi8 7 ao. De uma olhada:
64k
0 1 2 <- Numero do segmento ÀÄÄÄÄÄÄÁÄÄÄÄÄÄÙ 16 16 bytes bytes
0 0 O segundo segmento come8 7 a exatamente 16 bytes depois do primeiro. Deu pra perceber que o inicio do segundo segmento est DENTRO do primeiro, j que os segmentos tem 64k de tamanho!
Este esquema biruta confunde bastante os programadores menos 0 0 experientes e, at8 2 hoje, ninguem sabe porque a Intel resolveu 0 0 8 8
0 0 utilizar essa coisa esquisita. Mas, paci ncia, (^) 8 2assim que a coisa funciona!
Para encontrarmos um determinado byte dentro de um segmento 0 0 precisamos fornecer o OFFSET (deslocamento, em ingl8 8 s) deste byte relativo ao inicio do segmento. Assim, se queremos localizar o 0 0 d8 2 cimo-quinto byte do segmento 0, basta especificar 0:15, ou seja, 0 0 8 7
0 0 8 4
0 0 segmento 0 e offset 15. Esta nota o (^) 8 2usada no restante deste e de outros artigos.
Na realidade a CPU faz o seguinte c lculo para encontrar o 0 0 8 7
0 0 "endere o f¡sico" ou "endere8 7 o efetivo" na mem¢ria:
0 0 ³ ENDERE8 0 O-EFETIVO = (SEGMENTO * 16) + OFFSET ³
0 0 8 2
0 0 8 4
0 0 þ Primeiro teriamos que obter mais digitos... 0 at 9 n o s8 4 o suficientes. Pegaremos mais 6 letras do alfabeto para suprir esta deficiencia.
0 0 8 7
0 0 8 4
0 0 þ Segundo, Tomemos como inspira o um od 0 0 9 3 metro (equipamento dispon¡vel em qualquer autom¢vel - (^) 8 2 o medidor de quilometragem!): Quando o algarismo mais a direita (o menos 0 0 significativo) chega a 9 e 0 0 (^) 8 2 incrementado, o que ocorre?... Retorna a 0 e o pr¢ximo (^) 8 2incrementado, formando o 10. No caso do sistema hexadecimal, isto s¢ acontece quando o £ltimo 0 0 8 7
0 0 algarismo alcan a F e (^) 8 2 incrementado! Depois do 9 vem o A, 0 0 depois o B, depois o C, e assim por diante... at8 2 chegar a vez do F e saltar para 0, incrementando o pr¢ximo algarismo, certo?
0 0 8 2
0 0 8 7
0 0 8 4
0 0 Como contar em base diferente de dez 0 0 uma situa o n8 4 o muito 8 4
0 0 intuitiva, vejamos a regra de convers o de bases. Come8 7 aremos pela base decimal para a hexadecimal. Tomemos o n£mero 1994 como 0 0 exemplo. A regra 0 0 (^) 8 2 simples: Divide-se 1994 por 16 (base hexadecimal) at8 2 que o quoeficiente seja zero... toma-se os restos e tem-se o n£mer convertido para hexadecimal:
0 0 Toma-se ent8 4 o os restos de baixo para cima, formando o n£mero em hexadecimal. Neste caso, 1994=7CAh
Acrescente um 'h' no fim do n£mero para sabermos que se trata da base 16, do contr rio, se olharmos um n£mero "7CA" poderiamos 0 0 associa-lo a qualquer outra base num8 2 rica (base octadecimal por exemplo!)...
0 0 O processo inverso, hexa->decimal, (^) 8 2 mais simples... 0 0 basta escrever o n£mer, multiplicando cada digito pela pot8 8 ncia correta, levando-se em conta a equivalencia das letras com a base decimal:
³ 7CAh = (7 * 16^2) + (C * 16^1) + (A * 16^0) = ³ ³ (7 * 16^2) + (12 * 16^1) + (10 * 16^0) = ³ ³ 1792 + 192 + 10 = 1994 ³
As mesmas regras podem ser aplicadas para a base bin ria (que tem apenas dois digitos: 0 e 1). Por exemplo, o n£mero 12 em bin rio fica:
³ 12 = 1100b ³
0 0 Cada digito na base bin ria 0 0 (^) 8 2conhecido como BIT (Binary digIT - ou digito bin rio, em ingl8 8 s)! Note o 'b' no fim do n£mero convertido...
0 0 Fa8 7 a o processo inverso... Converta 10100110b para decimal.
0 0 A vantagem de usarmos um n£mero em base hexadecimal (^) 8 2que cada digito hexadecimal equivale a exatamente quatro digitos bin rios! 0 0 Fa8 7 a as contas: Quatro bits podem conter apenas 16 n£meros (de 0 a 0 0 15), que (^) 8 2exatamente a quantidade de digitos na base hexadecimal. ?