A maior rede de estudos do Brasil

Grátis
52 pág.
LINGUAGEM ASSEMBLY

Pré-visualização | Página 6 de 11

27 
 
 RET 8 
(CS:IP)←valor armazenado 
no topo da pilha. 
 (SP)←(SP)+d16 
 
INT num_vetor INT 21H 51 
(esclarecido noutro capítulo) 
INTO INTO 53 ou 4 
(esclarecido noutro capítulo) 
IRET IRET 
(esclarecido noutro capítulo) 
 
3.4.7.2 Desvio condicional 
 
 instrução descrição da condição de desvio 
 JA / JNBE Jump if above/not below nor equal 
 JAE / JNB Jump if above or equal/not below 
 JB / JNAE Jump if below/not above 
 JBE / JNA Jump if below or equal / not above 
 JC Jump if carry 
 JE / JZ Jump if equal / zero 
 JG / JNLE Jump if greater / not less nor equal 
 JGE / JNL Jump if greater or equal / not less 
 JLE / JNG Jump if less or equal/ not greather 
 JNC Jump if not carry 
 JNE / JNZ Jump if not equal / not zero 
 JNO Jump if not overflow 
 JNP / JPO Jump if not parit / parity odd 
 JNS Jump if not sign 
 JO Jump if overflow 
 JP / JPE Jump if parity / parity even 
 JS Jump if sign 
Tabela 1: Instruções de desvio condicional 
 Linguagem Assembly Família Intel 
 
 
última revisão Ago/2007 28 
 
 JA DESTINO 16 ou 4 
Como JMP ‘alvo’, desde 
que ‘cond’ seja satisfeita. 
JC CX 
 
3.4.8 Controle de Iteração 
 LOOP LABEL 16 ou 5 
 
Se (CX) ≠ 0, (IP)←alvo 
LOOPE/LOOPZ alvo LOOPE LABEL 18 ou 6 
(CX) ← (CX) -1 LOOPZ LABEL 
Se (CX) ≠ 0 e, (ZF) =0 
então (IP) ← alvo 
 
LOOPNE/LOOPNZ alvo LOOPE LABEL 19 ou 5 
(CX) ← (CX) -1 LOOPZ LABEL 
Se (CX) ≠ 0 e, (ZF) ) =0 
então (IP) ← alvo 
JCXZ alvo JCXZ ROTINA 18 ou 6 
Se (CX)=0, 
então (IP) ← alvo 
 
 
3.4.9 Manipulação da Pilha 
PUSH r16 PUSH SI 11(reg) ou
 10 (seg-reg)
 
 
 Linguagem Assembly Família Intel 
 
 
última revisão Ago/2007 29 
 
PUSH m16 PUSH RETURN_CODE[SI] 16+EA 
 
 
PUSHF PUSHF 10 
(SP) ←(SP) -2 
((SP)) ←flags 
POP r16 POP SI 8 
 
 
POP m16 POP PARAMETRO 17+EA 
(m16) ← ((SP)) 
(SP) ← (SP) + 2 
POPF POPF 8 
(flags) ← ((SP)) 
(SP) ← (SP) + 2 
 
3.4.10 Operações sobre ‘flags’ 
 CLC 2 
(CF) ← 00 
 CMC 2 
(CF) ← (CF) 
 STC 2 
(CF) ←00 
CLD CLD 2 
(DF) ← 0 
STD STD 2 
(DF) ← 1 
 Linguagem Assembly Família Intel 
 
 
última revisão Ago/2007 30 
CLI CLI 2 
(IF) ← 0 
STI STI 2 
(IF) ← 1 
 
3.4.11 Instruções de Entrada e Saída 
IN AL,d8 IN AL,3FH 10 
 IN AL,00H 
IN AL,DX IN AL,DX 8 
 
IN AX,DX IN AX,DX 
 
OUT d8,AL OUT 24H,AL 10 
 
OUT DX,AX OUT DX,AX 8 
 
 
OUT DX,AL OUT DX,AL 
 
 
3.4.12 "NO OPERATION" 
NOP NOP 3 
não realiza nenhuma 
operação 
 
 
3.4.13 Outras Instruções 
 
 Para tornar esta relação completa, serão mencionadas instruções, cuja 
compreensão demanda conhecimento ainda não disponíveis ao estudante nesta 
altura do curso. Por este motivo não será apresentada uma descrição destas 
instruções. São elas: ESC, HLT, LOCK, WAIT. 
 Linguagem Assembly Família Intel 
 
 
última revisão Ago/2007 31 
 
 
4 Subrotinas 
 
 A Figura 9 ilustra algumas técnicas que são utilizadas para escrever 
subrotinas em Assembly 86. Neste exemplo um programa chama uma subrotina 
(chamada EXEMPLO) passando a ela um vetor de bytes. Dois parâmetros são 
passados na pilha: o primeiro contém o número de elementos do vetor, e o segundo 
contém o endereço do primeiro elemento do vetor. Desta forma, embora a subrotina 
receba sempre dois parâmetros, eles podem ser usados para referenciar 
indiretamente qualquer número de variáveis na memória. 
 Os resultados que a rotina retorna devem estar em registradores ou em 
memória, mas não podem estar na pilha. AX ou AL são freqüentemente utilizados 
para conter o resultado de uma rotina quando se trata de um byte ou palavra. Este é 
comumente o caso das chamadas functions. Alternativamente o programa principal 
pode passar à subrotina como parâmetro o endereço (ou endereços) de uma área 
da memória onde deve ser escrito o resultado. 
 Cada linguagem de programação de alto nível tem uma convenção diferente 
para passagem de parâmetros na pilha. A convenção aqui apresentada é, portanto, 
apenas um exemplo. 
A Figura 10a mostra como está a pilha antes do programa principal 
armazenar os parâmetros na pilha. A Figura 10b mostra a pilha como a subrotina a 
vê, logo após a execução da instrução CALL. 
 A rotina EXEMPLO pode ser dividida em quatro seções. o prólogo, em que o 
reigstrador SP é preparado para ser utilizado como registrador de base nos acessos 
aos dados contidos na pilha. O próximo passo no prólogo é salvar o estado da 
máquina. Isto é feito armazenando na pilha todos os registradores alterados pela 
subrotina (no caso, apenas CX e BX). Se a subrotina modifica os flags, e o 
programa principal conta com que os flags estejam inalterados após a execução da 
subrotina, o registrador de estado também deve ser armazenado na pilha. 
A última instrução do prólogo aloca três palavras na pilha para serem usadas 
como variáveis locais. A Figura 10c mostra a pilha após o prólogo. O conjunto de 
palavras alocadas na pilha para esta rotina é chamado de “quadro” (“frame”) da 
rotina. 
 O corpo da rotina faz o processamento propriamente dito, que, em 
EXEMPLO, corresponde a nenhum processamento. 
 Os parâmetros na pilha são endereçados relativamente ao registrador BP, 
como mostra a Figura 10. 
 Linguagem Assembly Família Intel 
 
 
última revisão Ago/2007 32 
Figura 9: Exemplo do uso de passagem de parâmetros e criação de variáveis locais 
pela pilha. 
 
 
EX_SEG SEGMENT 
VETOR DB 10 DUP(?) 
 
ASSUME CS:EX_SEG,DS:EX_SEG;SS:EX_SEG;ES:NOTHING 
EXEMPLO PROC NEAR 
;Prólogo 
 PUSH BP ; salva BP 
 MOV BP,SP ; estabelece base 
 PUSH CX ; salva estado 
 PUSH BX ; “ “ 
 PUSHF ; e flags 
 SUB SP,6 ; aloca espaço para variáveis locais 
; fim do prólogo 
; Corpo 
 MOV CX,[BP+6] ; pega nº de elementos 
 MOV BX,[BP+4] ; pega endereço inicial do vetor 
 ƒ 
 ƒ 
 ƒ 
 ; variáveis locais estão em [BP-8], [BP-10] e [BP-12] 
 ; fim do corpo 
;Epílogo 
 ADD SP,6 ; desaloca variáveis locais 
 POPF ; restaura flags 
 POP BX ; restaura estado 
 POP CX ; “ “ 
 POP BP ; “ “ 
 ; fim do epílogo 
;Retorno da subrotina RET 4 
EXEMPLO ENDP 
 
; Programa principal 
START: MOV AX, SIZE VETOR 
 PUSH AX 
 MOV AX,OFFSET VETOR 
 PUSH AX 
 CALL EXEMPLO 
 ƒ 
 ƒ 
 ƒ 
EX_SEG ENDS 
 END START 
 Linguagem Assembly Família Intel 
 
 
última revisão Ago/2007 33 
 
 O epílogo desaloca o espaço das variáveis locais e restaura o valor antigo do 
estado da máquina. A Figura 10d mostra a configuração na pilha logo após o 
epílogo, pouco antes da instrução de retorno. A última seção da rotina é o retorno: 
instrução RET 4, além de restaurar o antigo valor de IP, descarta os parâmetros de 
entrada, acrescentado 4 ao conteúdo de SP. 
 
endereço 
baixo → 
 
 
 
 
 
 
 
 
 
Endereço 
alto → Í SP 
 
 (a) (b) ( c) (d) 
Figura 10: Condição da pilha: (a) antes do programa principal armazenar os 
parâmetros; (b) após a instrução CALL; ( c) após o prólogo;