






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
- - - - - - -
Tipologia: Notas de estudo
1 / 10
Esta página não é visível na pré-visualização
Não perca as partes importantes!







³ RBT þ Curso de Assembly þ Aula N§ 04 ³ ÔÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ;
Por: Bruno Diego
0 0 8 7
0 0 8 7
0 0 Come aremos a ver algumas instru (^) 9 4es do microprocessador 8086 0 0 8 7
0 0 agora. Existem os seguintes tipos de instru (^) 9 4es:
0 0 8 7
0 0 9 4
0 0 þ Instru (^) 0 0 es Aritim8 2 ticas 8 7
0 0 þ Instru (^) 0 09 4es L¢gicas 8 7
0 0 þ Instru (^) 0 09 4es de Controle de Fluxo de Programa 8 7
0 0 9 4
0 0 8 7
0 0 þ Instru es de manipula (^) 8 4o de flags 0 0 8 7
0 0 9 4
0 0 8 7
0 0 þ Instru (^) 0 0 es de manipula (^) 8 4o da pilha 8 7
0 0 9 4
0 0 8 7
0 0 þ Instru (^) 0 0 es de manipula (^) 8 4o de blocos 8 7
0 0 9 4
0 0 8 7
0 0 þ Instru es de manipula (^) 8 4o de registradores/dados 0 0 8 7
0 0 þ Instru (^) 9 4es de Entrada/Sa¡da
0 0 8 7
0 0 8 7
0 0 9 4
0 0 8 7
0 0 Vamos come ar com as instru es de manipula (^) 8 4o de registradores/dados por serem estas as mais f ceis de entender.
ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸ 0 0 8 7
0 0 ³ Instru (^) 8 4o MOV ³ ÔÍÍÍÍÍÍÍÍÍÍÍÍÍÍ;
MOV tem a finalidade de MOVimentar um dado de um lugar para outro. Por exemplo, para carregar um registrador com um determinado 0 0 valor. Isto (^) 8 2feito com MOV:
³ MOV AX,0001h ³
0 0 9 0 a mesma coisa que dizer: "AX = 1". Na verdade, movimentamos o valor 1 para dentro do registrador AX.
Podemos mover o conte£do de um registrador para outro:
0 0 9 0 a mesma coisa que "BH = CL"! 0 0 Os registradores de segmento n8 4 o podem ser inicializados com MOV 0 0 8 2
0 0 tomando um parametro imediato (num rico). Esses registradores s8 4 o inicializados indiretamente:
Carregar um registrador com o conte£do (byte ou word, depende da 0 0 8 7
0 0 8 4
0 0 instru o!) armazenado em um segmento 0 0 (^) 8 2simples, basta especificar o
8 7
0 0 offset do dado entre colchetes. Aten (^) 8 4o que o segmento de dados 0 0 8 2
0 0 (DS) assumido por default com algumas excess9 4 es:
³ MOV AL,[0FFFFh] ³
0 0 8 7
0 0 8 4
0 0 A instru o acima, pega o byte armazenado no endere8 7 o DS:FFFFh e coloca-o em AL. Sabemos que um byte vai ser lido do offset especificado porque AL tem 8 bits de tamanho. 0 0 Ao inv8 2 s de usarmos um offset imediato podemos usar um registrador:
³ MOV BX,0FFFFh ³ ³ MOV CH,[BX] ³
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
0 0 8 2
0 0 8 7
0 0 Neste caso, BX cont m o offset e o byte no endere o DS:BX8 2 armazenado em CH. Note que o registrador usado como indice obrigatoriamente deve ser de 16 bits.
0 0 8 4
0 0 S¢ que neste caso ser 0 0 o armazenados 2 bytes no endere8 7 o ES:BX. O primeiro byte (^) 8 2 o menos significativo e o segundo o mais 0 0
8 7
0 0 signigicativo. Essa instru (^) 8 4o equivale-se a:
0 0 8 7
0 0 ³ MOV ES:[BX],AL ; Instru (^) 9 4ess que fazem a mesma ³ ³ MOV ES:[BX + 1],AH ;coisa que MOV ES:[BX],AX ³
0 0 8 2
0 0 8 4
0 0 8 2
0 0 8 7
0 0 Repare tamb m que n o poss¡vel mover o conte£do de uma posi (^) 8 4o da mem¢ria para outra, diretamente, usando MOV. Existe outra 0 0 8 7
0 0 8 4
0 0 8 7
0 0 instru o que faz isso: MOVSB ou MOVSW. Veremos essas instru (^) 9 4es mais tarde.
Regra geral: Um dos operandos TEM que ser um registrador! Salvo 0 0 8 7
0 0 8 4
0 0 8 7
0 0 no caso da movimenta o de um imediato para uma posi (^) 8 4o de mem¢ria:
0 0 8 7
0 0 8 4
0 0 Para ilustrar o uso da instru o MOV, eis um peda8 7 o do c¢digo usado pela ROM-BIOS do IBM PS/2 Modelo 50Z para verificar a integridade dos registradores da CPU:
³ MOV AX,0FFFFh ;Poe 0FFFFh em AX ³ ³ MOV DS,AX ³ ³ MOV BX,DS ³ ³ MOV ES,BX ³ ³ MOV CX,ES ³ ³ MOV SS,CX ³ ³ MOV DX,SS ³ ³ MOV SI,DX ³ ³ MOV DI,SI ³ ³ MOV BP,DI ³
0 0 8 4
0 0 Se o conte£do de BP n o for 0FFFFh ent 0 0 8 4 o a CPU est com algum 8 4
0 0 problema e o computador n o pode funcionar! Os flags s8 4 o testados de uma outra forma... :)
0 0 8 7
0 0 Esta instru (^) 8 4o serve para trocarmos o conte£do de um registrador pelo outro. Por exemplo:
0 0 8 7
0 0 Se AH=1Ah e AL=6Dh, ap¢s esta instru (^) 8 4o AH=6Dh e AL=1Ah por causa da troca...
0 0 8 8
0 0 Pode-se usar uma refer 0 0 ncia (^) 8 5mem¢ria assim como em MOV... com 8 7
0 0 a mesma restri (^) 8 4o de que um dos operandos TEM que ser um 0 0 registrador. N8 4 o h possibilidade de usar um operando imediato.
³ MOVSB e MOUSW ³ ÔÍÍÍÍÍÍÍÍÍÍÍÍÍÍ;
0 0 8 7
0 0 9 4
0 0 Essas instru 0 0 es suprem a defici8 8 ncia de MOV quanto a 8 7
0 0 8 4
0 0 8 7
0 0 movimenta o de dados de uma posi (^) 8 4o de mem¢ria para outra diretamente. Antes de ser chamada os seguintes registradores tem que ser inicializados:
0 0 8 8
0 0 ³ DS:SI <- DS e SI t (^) 0 0m o endere8 7 o fonte ³ 8 8
0 0 ³ ES:DI <- ES e DI t m o endere8 7 o destino ³
0 0 8 7
0 0 8 4
0 0 8 7
0 0 Depois da execu o da instru (^) 8 4o o registrador SI ser incrementado ou decrementado de acordo com o flag D (Direction). No caso de usarmos LODSW, SI ser incrementado de 2 para garantir que DS:SI aponte para a pr¢xima word.
ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸ 0 0 8 7
0 0 9 4
0 0 8 7
0 0 ³ Outras instru es de manipula (^) 8 4o de registros/dados ³ ÔÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ;
0 0 8 7
0 0 Existem ainda as instru (^) 9 4es LEA, LES e LDS.
þ LEA:
0 0 8 2
0 0 8 7
0 0 LEA 0 0 , basicamente, igual a instru (^) 8 4o MOV, com apenas uma 8 7
0 0 8 2
0 0 diferen a: o operando "fonte" um endere8 7 (^) 0 0o (precisamente: um "offset"). LEA simplesmente calcula o endere8 7 (^) 0 0o e transfere para o
8 7
0 0 operando "destino", de forma que as instru (^) 9 4es abaixo sao equivalentes:
³ MOV BX,100h ³ ³ LEA BX,[100h] ³
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
0 0 8 2
0 0 8 7
0 0 Por m, a instru (^) 8 4o:
³ LEA DX,[BX + SI + 10h] ³ ³
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
Equivale a:
³ ADD DX,10h ; DX = DX + 10h ³
0 0 8 7
0 0 8 4
0 0 8 7
0 0 Repare que apenas uma instru o faz o servi o de tr8 8 s!! Nos
0 0 8 7
0 0 processadores 286 e 386 a diferen a (^) 8 2 significativa, pois, no exemplo acima, LEA gastar 3 (nos 286) ou 2 (nos 386) ciclos de m quina enquando o equivalente gastar 11 (nos 286) ou 6 (nos 386) 0 0 8 7
0 0 8 4
0 0 ciclos de m quina! Nos processadores 8088/8086 a diferen a n o8 2 tao grande...
Obs: Consideremos cada ciclo de m quina seria, aproximadamente, 0 0 num 386DX/40, algo em torno de 300ns - ou 0,0000003s. 0 0 (^) 9 0uma medida empirica e n 0 0 8 4 o expressa a grandeza real (depende de 8 2
0 0 uma s rie de fatores n8 4 o considerados aqui!).
0 0 O operando "destino" 0 0 (^) 8 2 sempre um registrador. O operando 8 2
0 0 "fonte" sempre um endere8 7 o.
þ LDS e LES
Existe uma forma de carregar um par de registradores (segmento:offset) de uma s¢ vez. Se quisermos carregar DS:DX basta 0 0 8 7
0 0 usar a instru (^) 8 4o LDS, caso o alvo seja ES, usa-se LES.
0 0 8 7
0 0 Suponhamos que numa posi (^) 8 4o da mem¢ria tenhamos um double word (n£mero de 32 bits) armazenado. A word mais significativa correspondendo a um segmento e a menos signigicativa a um offset 0 0 8 2
0 0 8 7
0 0 (esse o caso da tabela dos vetores de interrup (^) 8 4o, que descreverei com poucos detalhes em uma outra oportunidade!). Se usamos:
O par ES:BX ser carregado com o double word armazenado no 0 0 endere8 7 o apontado por DS:SI (repare no segmento default 0 0 que
8 7
0 0 8 4
0 0 discutimos em um texto anterior!). A instru o acima (^) 8 2equivalente a:
0 0 8 7
0 0 8 4
0 0 De novo, uma instru o substitui tr8 8 s!
0 0 8 7
0 0 9 4
0 0 8 7
0 0 Existem mais algumas instru es de manipula (^) 0 08 4o de 8 7
0 0 registradores/dados, bem como mais algumas de manipula 0 0 (^) 8 4o de blocos. Que ficar8 4 o para uma pr¢xima mensagem. ?