Académique Documents
Professionnel Documents
Culture Documents
Introduo
Arquitetura interna
3.1
contedo
little endien
endereo
A
A+1
contedo
big endien
3.2
Comandos
Algumas Diretivas
aulas de laboratrio.
3.2.1.1
Constantes
STRING[SI],A
; caracter
MOV
STRING[SI], 41h
; equivalente em hexadecimal
ADD
AX, 0C4H
OCTAL_8
EQU 10Q
; 8 em octal
OCTAL_9
EQU 11Q
; binrio
UMS
EQU 11111111B
; 9 em octal
MENOS_5 EQU -5
MENOS_8 EQU -6D
; decimal (default)
; D indica que decimal
3.2.1.2
Definio de Dados
A maioria dos programas iniciam difinindo as variveis com que eles vo
trabalhar. Trs diretivas, DB, DW e DD so usadas para alocar e dar nome a
posies de memria. So usadas para definir variveis em trs unidades: DB
significa define byte, DW significa define word e DD significa define doubleword.
ltima reviso Ago/2007
DB
; no inicializada
BETA
DW
; no inicializada
GAMA
DD
; no inicializada
UPSILON
DW
; constante 05H
IOTA
DB
HELLO
; contm 48 45 4C 4C 4F H
MU
DD
100 DUP 0
MOV
[BX],5
SUB
ANA
BETA,32H
CMP
DEC
exemplo anterior), como byte. A ltima linha tem um aspecto interessante. Embora a
varivel GAMA tenha sido definida como palavra dupla, a instruo decrementa
apenas o byte apontado pelo endereo GAMA, sem alterar os demais 3 bytes da
palavra dupla.
A diretiva TYPE identifica a unidade de alocao de memria (1 = byte; 2 =
palavra, 4 = palavra dupla).
A linguagem prov duas diretivas: LENGHT e SIZE, que podem ser escrito
nas instrues com informaes de atributo. LENGHT faz o montador retornar com
o nmero de unidades de armazenamento (bytes, palavras ou palavras duplas)
ocupadas por um vetor. SIZE leva o montador a retornar o nmero de bytes
ocupados pela varivel ou vetor.
Estas diretivas permitem que se escrevam seqncias de instrues que no
precisam ser mudadas (somente montadas novamente), se os atributos das
variveis mudarem, por exemplo, um vetor de bytes muda para um vetor de
palavras.
O exemplo a seguir ilustra uma aplicao tpica destas diretivas.
; soma do contedo de uma tabela em AX
; observe que a mesma instruo funciona para
; TABELA
DB
50
DUP(?)
; TABELA
DD
50
DUP(?)
SUB
AX,AX
; zera contador
MOV
; nmero de iteraes
MOV
SUB
ADD
; soma um elemento
SOMA_OUTRO:
; AX contm a soma
Existe tambm a diretiva OFFSET. Basta por enquanto considerar que esta
diretiva retorna o prprio endereo da varivel referenciada no programa logo em
seguida a esta diretiva.
Do mesmo modo, algumas outras diretivas relacionadas com o mecanismo de
segmentao do processador, no sero apresentadas aqui. Embora todo programa
ltima reviso Ago/2007
deva cont-las para que o montador funcione corretamente, este texto limita-se a
mencion-las sem discutir em detalhes o seu papel.
3.2.1.3
Incio e Final de Subrotinas
Em ASM86 uma subrotina (rotina) ativada atravs da instruo CALL, como
se ver adiante. O cdigo da subrotina termina necessariamente com a instruo
RET, que desvia o fluxo controle para a instruo seguinte ao CALL. As instrues
de uma rotina so emolduradas pelas diretivas PROC e ENDP, como no exemplo a
seguir:
HISTOGRAMA
PROC
FAR
;
Esta rotina assume que o parmetro de entrada est em AL,
;
e incrementa um contador numa tabela de frequncia,
;
baseada no valor do parmetro de entrada.
XOR
AH,AH
; zera o byte mais significativo de AX
MOV
SI,AX
; ndice para a tabela
INC
FREQ[SI] ; incrementa o contador
RET
HISTOGRAMA
ENDP
O uso da diretiva NEAR/FAR ser esclarecido posteriormente.
3.3
Modos de Endereamento
Registrador
Neste modo de endereamento, o operando est contido num dos
registradores internos da mquina. Estas instrues so muito compactas pois o
endereo do registrador est codificado em uns poucos bits. O acesso a este
operando realizado inteiramente dentro do prprio processador, e no envolve
acesso externo memria. Exemplos:
MOV
SUB
DEC
ltima reviso Ago/2007
AL,BL
CX,DX
CL
9
3.3.2
Imediato
O operando est contido na prpria instruo. Este operando pode ter 8 ou 16
bits. Exemplos:
SUB
ADD
CL,2
DX,MENOS_5
opcode
desloc
camento
Endereo
Efetivo
10
3.3.3
Direto
Trata-se do modo de endereamento de memria mais simples. No envolve
nenhum registrador. O endereo efetivo tomado diretamente do deslocamento
contido na prpria instruo. Este modo de endereamento tipicamente utilizado
para referenciar escalares. A Figura 4 ilustra o formato destas instrues.
Alguns exemplos:
MOV
SUB
DEC
AX,[8000H]
CX,BETA
byte ptr GAMA
3.3.4
Registrador Indireto
O endereo do operando pode ser tirado de um dos registradores de base
(BX ou BP) ou ndice (SI ou DI), como mostra a Figura 5. Qual destes registradores
usado est definido num dos campos da instruo.
opcode
BX ou BP
ou
SI ou DI
Endereo
Efetivo
MOV
SUB
AL,[BX]
[SI],DX
Convm, contudo, notar que qualquer registrador de uso geral pode ser
utilizado neste modo de endereamento nas instrues do tipo JMP e CALL.
Exemplos destes casos so:
JMP
CALL
ltima reviso Ago/2007
[AX]
[DX]
11
3.3.5
opcode
desloc
camento
BX ou BP
Endereo
Efetivo
MOV
SUB
ADD
AL,[BX+0B000H]
CL,MU[BX]
dword ptr [BP][1000H], 43H
3.3.6
Indexado
No modo de endereamento indexado o endereo efetivo calculado a partir
da soma de um deslocamento mais o contedo de um registrador de ndice (SI ou
DI, conforme definido no campo mod_reg_r/m), como mostra a Figura 7. Este modo
de endereamento freqentemente utilizado para referenciar elementos de um
vetor: o deslocamento apontando para o incio do vetor e o valor do registrador de
ndice selecionando um dos seus elementos. Como todos os elementos de um vetor
tm o mesmo comprimento, uma aritmtica simples com o registrador de ndice
selecionar qualquer elemento.
12
opcode
desloc
camento
SI ou DI
Endereo
Efetivo
MOV
ADD
AL,[BX+SI+ 5H]
[BP][DI][1000H], AX
13
opcode
desloc
camento
BX ou BP
Endereo
Efet-ivo
SI ou DI
3.4
Convenes
Na apresentao a seguir adota-se a seguinte conveno:
d
uma quantidade de 8 ou 16 bits.
d8
uma quantidade de 8 bits.
d16
uma quantidade de 16 bits.
r, r1, r2
um registrador de 8 ou 16 bits de uso geral.
r8
um registrador de 8 bits.
r16
um registrador de 16 bits.
()
o contedo de um registrador, ou posio de memria,
dependendo do que estiver entre os parnteses.
m
endereo de um byte ou uma palavra na memria
ltima reviso Ago/2007
14
m8
m16
m32
AX/AL
alvo
flags
r1:r2
MOV CX,BP
MOV r,m
MOV AX,TEMP_RESULT
10/8+EA
MOV CL,ARRAY[SI],
MOV m,r
MOV COUNT[DI],CX
10/9+EA
MOV [SI+1000],DX
MOV r,d
MOV AX,99 4
MOV SI,61CH
MOV m,d
10+EA
XCHG m,r
XLAT
XCHG
AX,BX
XCHG
CL,CH
XCHG
SEMAFORO,AX
XCHG
AL,[BX+2]
XLAT
17+EA
11
(AL) ((BX+AL))
ltima reviso Ago/2007
3/4
15
LAHF
LAHF
SAHF
(AH7,6,4,2,0) (SF,ZF,AF,PF,CF)
SAHF
(SF,ZF,AF,PF,CF) (AH7,6,4,2,0)
3.4.3
Instrues de Manipulao de Cadeias de Caracteres (string)
Cada uma das instrues deste grupo tem trs formatos diferentes. Para o primeiro
formato (terminado com um "S"), o montador entende que o string de bytes ou de
palavras. O segundo (terminado com um "SB") e terceiro (terminado com um "SW")
indicam explicitamente que se trata respectivamente de um string de bytes e palavras.
MOVS/MOVSB/MOVSW
MOVSB
18
MOVSW
CMPS/CMPSB/CMPSW
CMPSB
22
CMPSW
SCAS/SCASB/SCASW
SCASB
15
SCASW
LODS/LODSB/LODSW
LODSB
12
LODSW
STOS/STOSB/STOSW
STOSB
11
STOSW
REP
REP MOVSB
9+17*rep
REP
REP LODSW
9+13*rep
REP
REP STOSW
9+10*rep
REPZ/REPE
REPZ CMPS
9+22*rep
REPNZ/REPNE
REPNZ SCAS
9+15*rep
Nas cinco ltimas linhas da tabela contm prefixos usados para repetir a
ltima reviso Ago/2007
16
0 e ZF
0.
3.4.4
Instrues de Manipulao de Endereos
LEA
BX,[BP][DI]
LEA r16,m16
2+EA
(r16) m16
LDS r16,m32
LDS SI,DATA_SEG[DI]
16+EA
LES SI,DATA_SEG[DI]
16+EA
(r16) (m32)
(DS) (m32)+2
LES r16,m32
(r16) (m32)
(ES) (m32)+2
3.4.5
Instrues Aritmticas
3.4.5.1
Adio
ADD r1,r2
ADD AX,SI
ADD CL,DH
ADD r,m
ADD DL,[300]
9+EA
ADD CX,[BX+1234H]
ADD m,r
16+EA
ADD AL,4
(r) (r) + d
ADD AX,50
ADD m,d
(m) (m) + d
17
17+EA
ADC r1,r2
ADC BX,DX
ADC DH,AL
ADC r,m
ADC BL,[456]
9+EA
ADC m,r
ADC r,d
ADC CL,24
ADC BX,50
ADC m,d
INC r
INC
AX
(r) (r) + 1
INC
CL
16+EA
17+EA
15+EA
INC m
(m) (m) + 1
INC
3.4.5.2
Subtrao
SUB r1,r2
SUB AX,SI
SUB CL,DH
SUB r,m
SUB DL,[300]
SUB CX,[BX+1234H]
SUB m,r
SUB r,d
SUB AL,4 4
(r) (r) - d
SUB AX,50
SUB m,d
(m) (m) - d
SBB r1,r2
SBB BX,DX
SBB DH,AL
9+EA
16+EA
17+EA
18
SBB r,m
SBB BL,[456]
9+EA
16+EA
SBB r,d
SBB CL,24
SBB BX,50
SBB m,d
DEC r
DEC AX
(r) (r) - 1
DEC Cl
DEC m
17+EA
15+EA
NEG BX
NEG AL
NEG m
(m) 0 - (m)
NEG MULTIPLICADOR
CMP r1,r2
CMP BX,CX
16+EA
CMP AL.BL
CMP r,m
(r) - (m)
CMP CH,[SI+BX+10]
CMP m,r
CMP [BP+2],SI
(m) - (r)
CMP [SI],AX
CMP r,d
CMP BL,02H
(r) - d
CMP DL,85H
CMP m,d
CMP RADAR[DI],3420H
9+EA
(m) - d
9+EA
19
10+EA
3.4.5.3
MUL r
Multiplicao
MUL BL
70-77
MUL CX
118-133
MUL m
(76-83)+EA
(124-139)+EA
MUL BAUD_RATE
(sem sinal)
IMUL r
IMUL BL
80-98
IMUL CX
128-154
(86-104)+EA
(134-160)+EA
Diviso
DIV r16
DIV CL
80-90
DIV DX
144-162
(sem sinal)
20
DIV m8
(88-96)+EA
(150-168)+EA
(sem sinal)
DIV m16
(AX)(DX:AX)/(m16)
(DX)(DX:AX)mod(m16)
(sem sinal)
IDIV r8
IDIV CL
101-112
IDIV DX
165-184
(AL)(AX)/(r8)
(AH)(AX) mod (r8)
(com sinal)
IDIV r16
(AX)(DX:AX)/(r16)
(DX)(DX:AX) mod (r16)
(com sinal)
IDIV m8
(107-118)+EA
(171-190)+EA
(AL)(AX)/(m8)
(AH)(AX) mod (m8)
(com sinal)
IDIV m16
(AX)(DX:AX)/(m16)
(DX)(DX:AX)mod(m16)
(com sinal)
CBW
CBW
Se (AL)<0,
ento (AH) 0FF
caso contrrio, (AH) 00
21
CWD
CWD
DX) FFFFH
Se (AX)<0, ento (
DX) 0
caso contrrio, (
3.4.5.5
nstrues de Ajuste
Estas instrues so utilizadas quando os dados manipulados pelo programa
esto em formato ASCII ou BCD. Tendo em vista que estas so instrues de uso
infreqente, este trabalho limita-se a mencion-las. So elas:
AAA
AAA
DAA
DAA
AAS
AAS
DAS
DAS
AAM
AAM
83
AAD
AAD
60
3.4.6
Instrues Lgicas
3.4.6.1
E
AND r1,r2
AND AL,BL
AND CL,AH
AND r,m
AND DL,[SI+5]
9+EA
AND CX,FLAG_WORD
AND m,r
AND ASCII[DI],DL
AND r,d
AND AX,7F7FH
(r) (r) d
AND CX,0F0H
AND m,d
AND BETA,01H
(m) (m) d
TEST r1,r2
TEST SI,DI
17+EA
TEST CX,DX
ltima reviso Ago/2007
16+EA
22
TEST r,m
TEST SI,END_COUNT
(r) (m)
TEST CX,[SI]
TEST r,d
TEST BX,0CC4H
(r) d
TEST AL,8
TEST m,d
TEST RETURN_CODE,01H
(m) d
3.4.6.2
OR r1,r2
9+EA
4/5
11+EA
OU
OR
AL,BL
OR
CL,AH
OR
DL,[SI+5]
OR
CX,FLAG_WORD
OR m,r
OR
ASCII[DI],DL
OR
OR r,d
OR
AX,7F7FH
(r) (r) + d
OR
CX,0F0H
OR m,d
OR
BETA,01H
(m) (m) + d
OR
3.4.6.3
OU exclusivo
XOR r1,r2
XOR AL,BL
OR r,m
9+EA
16+EA
17+EA
XOR CL,AH
XOR r,m
XOR DL,[SI+5]
9+EA
XOR CX,FLAG_WORD
XOR m,r
XOR ASCII[DI],DL
XOR r,d
XOR AX,7F7FH
(r) (r) d
XOR CX,0F0H
23
16+EA
XOR m,d
XOR BETA,01H
(m) (m) d
3.4.6.4
NOT r
NOT AX
17+EA
Complemento
3
NOT CL
NOT m
3.4.6.5
Deslocamento
SAL/SHL r,1
SAL AL,1
SAL/SHL r,CL
SHL DX,CL
SAL/SHL m,1
SAL/SHL m,CL
SHL STORE_COUNT,CL
CF
16+EA
2
8+4*(CL)
15+EA
20+EA+4*(CL)
SHR r,1
SHR AL,1
SHR r,CL
SHR DX,CL
SHR m,1
SHR m,CL
SHR STORE_COUNT,CL
8+4*(CL)
15+EA
0+EA+4*(CL
)
CF
24
SAR r,1
SAR AL,1
SAR r,CL
SAR DX,CL
SAR m,1
SAR m,CL
SAR STORE_COUNT,CL
8+4*(CL)
15+EA
20+EA+4*(CL)
CF
3.4.6.6
ROL r,1
Rotao
ROL AL,1
ROL r,CL
ROL DX,CL
8+4*(CL)
ROL m,1
ROL m,CL
ROL STORE_COUNT,CL
15+EA
0+EA+4*(CL
)
CF
ROR r,1
ROR AL,1
ROR r,CL
ROR DX,CL
ROR m,1
ROR m,CL
ROR STORE_COUNT,CL
CF
2
8+4*(CL)
25
15+EA
20+EA+4*(CL)
RCL r,1
RCL AL,1
RCL r,CL
RCL DX,CL
RCL m,1
RCL m,CL
RCL STORE_COUNT,CL
CF
2
8+4*(CL)
15+EA
20+EA+4*(CL)
RCR r,1
RCR AL,1
RCR r,CL
RCR DX,CL
RCR m,1
RCR m,CL
RCR STORE_COUNT,CL
CF
2
8+4*(CL)
3.4.7
3.4.7.1
Instrues de Desvio
Desvio incondicional
JMP CX
(CS:IP) alvo
(CS:IP) alvo.
O endereo de retorno
armazenado na pilha.
RET
(CS:IP)valor armazenado
no topo da pilha
26
15+EA
20+EA+4*(CL)
RET 8
(CS:IP)valor armazenado
no topo da pilha.
(SP)(SP)+d16
INT 21H
INT num_vetor
51
INTO
INTO
53 ou 4
IRET
IRET
(esclarecido noutro captulo)
3.4.7.2
Desvio condicional
instruo
JA / JNBE
JAE / JNB
JB / JNAE
JBE / JNA
JC
JE / JZ
JG / JNLE
JGE / JNL
JLE / JNG
JNC
JNE / JNZ
JNO
JNP / JPO
JNS
JO
JP / JPE
JS
27
JA
Como JMP alvo, desde JC
DESTINO
16 ou 4
CX
3.4.8
Controle de Iterao
LOOP LABEL
Se (CX)
16 ou 5
0, (IP)alvo
LOOPE/LOOPZ alvo
LOOPE LABEL
(CX) (CX) -1
LOOPZ LABEL
Se (CX) 0 e, (ZF)
18 ou 6
=0
LOOPNE/LOOPNZ alvo
LOOPE LABEL
(CX) (CX) -1
LOOPZ LABEL
Se (CX) 0 e, (ZF) )
19 ou 5
=0
JCXZ ROTINA
18 ou 6
Se (CX)=0,
ento (IP) alvo
3.4.9
Manipulao da Pilha
PUSH SI
PUSH r16
11(reg) ou
10 (seg-reg)
28
PUSH m16
PUSH RETURN_CODE[SI]
16+EA
PUSHF
PUSHF
10
POP r16
POP SI
POP m16
POP PARAMETRO
(SP) (SP) -2
((SP)) flags
17+EA
(m16) ((SP))
(SP) (SP) + 2
POPF
POPF
(flags) ((SP))
(SP) (SP) + 2
3.4.10
(CF)
00
CMC
STC
CLD
STD
(CF) (CF)
(CF) 00
CLD
(DF) 0
STD
(DF) 1
ltima reviso Ago/2007
29
CLI
CLI
STI
(IF) 0
STI
(IF) 1
3.4.11
Instrues de Entrada e Sada
IN AL,3FH
IN AL,d8
10
IN AL,00H
IN AL,DX
IN AL,DX
IN AX,DX
IN AX,DX
OUT d8,AL
OUT 24H,AL
10
OUT DX,AX
OUT DX,AX
OUT DX,AL
OUT DX,AL
3.4.12
NOP
no
"NO OPERATION"
NOP
realiza
nenhuma
operao
3.4.13
Outras Instrues
30
Subrotinas
31
EX_SEG
VETOR
SEGMENT
DB
10 DUP(?)
ASSUME
EXEMPLO
;Prlogo
CS:EX_SEG,DS:EX_SEG;SS:EX_SEG;ES:NOTHING
PROC
NEAR
PUSH
MOV
PUSH
PUSH
PUSHF
SUB
BP
BP,SP
CX
BX
MOV
MOV
SP,6
; salva BP
; estabelece base
; salva estado
;
; e flags
; aloca espao para variveis locais
; fim do prlogo
; Corpo
RET 4
EX_SEG
ENDS
END
START
32
Endereo
alto
SP
(a)
(b)
( c)
(d)
33
identificveis. Nas instrues mais longas so os primeiros dois bytes que contm a
chave para a decodificao. O formato destes bytes varia mas a maioria das intrues
segue o formato apontado na Figura 11
byte 1
byte 2
byte 3
byte 4
byte 5
byte 6
34
valor
0
1
0
1
0
1
0
1
0
1
funo
nenhuma estenso do sinal
sinal do valor de 8 bits extendido se W=1
a instruo opera sobre byte
a instruo opera sobre palavra de 16 bits
o campo REG identifica o operando fonte
o campo REG identifica o operando destino
deslocamento/rotao de uma posio
deslocamento/rotao especificado em CL
repetio/iterao, enquanto ZF = 0
repetio/iterao, enquanto ZF = 1
Tabela 2: Codificao dos campos de um bit
R/M
000
001
010
011
100
101
110
111
MOD=11
W=0
AL
CL
DL
BL
AH
CH
DH
BH
W=1
AX
CX
DX
BX
SP
BP
SI
DI
35
36
37
Figura 14: Formao do endereo no 8086/800 (a) para acesso a cdigo, (b) para
acesso a operando.
para cesso a
para acesso
DS
o contedo do registrador
BP
pilha usa-se SS
instruo
clocks
9+EA
88 9C 00 40
por exemplo, move o contedo da posio de memria, cujo endereo efetivo dado
pelo contedo do registrador DS ("default" neste caso) deslocado 4 bits esquerda,
adicionado ao valor do deslocamento, que neste caso o endereo do primeiro byte
do vetor ARRAY, adicionado ainda ao contedo do registrador de ndice SI, para o
registrador BL. Se, ao invs de utilizar o registrador de segmento "default", se deseja
utilizar, digamos, o registrador ES, a instruo em Assembly toma a seguinte forma:
cdigo
instruo
26 88 9C 00 40
clocks
9+EA
39
7.1
Desvios intra-segmento
instruo
clocks
E9 00 40
15
FF E3
11
18+EA
FF A7 00 40
40
cdigo
instruo
clocks
15
EB 0F
instruo
E9 78 01
clocks
15
7.2
Desvios inter-segmento
Instruo
EA 00 30 34 02
clocks
15
FF AC 28 00
24+EA
7.3
Desvios condicionais
Instruo
76 3F
clocks
16 ou 4
41
7.4
Instrues CALL
cdigo
Instruo
clocks
E8 00 40
; direto prximo
19
FF D3
; indireto prximo
16
FF 10
; indireto prximo
21+EA
9A 00 03 27 11
; direto longo
FF AD 00 04
; indireto longo
28
37+EA
7.5
Instrues RET
De modo anlogo ao que ocorre com a instruo CALL, existem dois tipos de
instrues de retorno: o primeiro para o retorno de subrotinas distantes e outro para o
retorno de subrotinas prximas. As instrues do primeiro tipo restauram apenas o
contedo do IP, enquanto as do segundo tipo restauram tanto IP quanto CS.
Exemplos:
cdigo
instruo
clocks
CB
; intra-segmento (prximo
CA 08 00
; intra-segmento (prximo)
12
C3
; inter-segmento (distante)
18
C2 08 00
; inter-segmento (distante)
17
42
de instrues.
2. no existe nenhuma solicitao de acesso ao barramento
pendente vinda da EU.
A Figura 15 ilustra as aes do 8086 e o contedo da fila de instrues quando
o 8086 executa uma instruo. Admite-se que esta instruo esteja contida em dois
bytes e que a fila se encontra vazia imediatamente antes do incio da execuo. Esta
instruo gasta 7 ciclos de relgio para calcular o endereo efetivo do operando que
se encontra na memria e mais 6 ciclos de relgio para executar a operao.
A EU est ativa quando est executando instrues e inativa quando espera
ltima reviso Ago/2007
43
que a BIU lhe fornea um dado ou instruo. A BIU s est ativa quando atende
alguma solicitao da EU ou quando h pelo menos 2 (no 8088 1) bytes livres na fila
de instrues. Quando estas duas condies esto satisfeitas ao mesmo tempo, a
prioridade sempre dada solicitao da EU. Quando chega uma solicitao da EU
enquanto a BIU realiza uma busca de instruo, a solicitao da EU s passa a ser
atendida depois de que o acesso que est em andamento for completado. Neste caso
a EU forada a esperar ociosa.
1 ciclo
2 ciclo
3 ciclo
4 ciclo
5 ciclo
6 ciclo
E
U
B
I
U
Figura 15: Diagrama de atividades da EU e da BIU
clocks
6
5
base + ndice
7
8
11
11
12
12
deslocamento
+ base
+ ndice
BX+SI ou BX+DI
BP+SI, BP+ DI
BP+DI+deslocamento
BX+SI+deslocamento
BP+SI+deslocamento
BX+DI+deslocamento
45
10
Exerccios
1 Questo
Sejam m e k dois nmeros hexadecimais de 32 bits armazenados respectivamente
nos registradores DX:AX e CX:BX, de tal forma que AX e BX contm os 16 bits
menos significativos de m e k respectivamente. Escreva um trecho de programa em
ASM86 que subtraia k de m e coloque o resultado em DX:AX. Se m < k o resultado
produzido deve ser zero.
2 Questo
Repita o exerccio anterior admitindo que m e k esto armazenados respectivamente
a partir dos endereos MMMM e KKKK. DX:AX deve conter o resultado.
3 Questo:
Escreva um trecho de programa em ASM86 que multiplique o contedo do
registrador AL pelo contedo do registrador CL, deixando o resultado em AX. Voc
no poder usar a instruo MUL ou IMUL. Utilize sucessivas adies.
4 Questo:
Escreva um trecho de programa em ASM86 que divida o contedo do registrador DX
pelo contedo do registrador AX, deixando o quociente inteiro em AX. Voc no
poder usar a instruo DIV ou IDIV. Utilize sucessivas subtraes.
5 Questo:
Escreva um trecho de programa em ASM86 que eleve o contedo do registrador AX
ao contedo do registrador DX. O resultado de 32 bits deve ser colocado no par de
registradores CX:AX. Caso o valor obtido no possa ser representado em 32 bits, o
contedo de DX:AX dever ser nulo.
46
6 Questo:
Escreva um trecho de programa em ASM86 que zere todo o registrador AL, se o seu
nibble2 menos significativo for igual a zero e carregue o valor 0FFH em AL, caso
contrrio.
7 Questo:
Escreva um trecho de programa em ASM86 que produza nos bits de ordem mpar os
correspondentes bits do registrador BL, e nos bits de ordem par de AL os
correspondentes bits de CL.
8 Questo:
Escreva um trecho de programa em ASM86 que produza nos bits de ordem par de
AL o ou exclusivo dos bits correspondentes dos registradores BL e CL, e nos bits de
ordem mpar mantenha o mesmo valor inicial.
9 Questo:
Escreva um trecho de programa em ASM86 que faa o ou exclusivo entre os dois
nibbles2 do registrador AL.
10 Questo:
Escreva um trecho de programa em ASM86 que transforme um nmero em formato
BCD armazenado em AL no seu correspondente valor hexadecimal Voc no pode
usar as instrues de multiplicao, diviso, e de ajuste a BCD.
11 Questo:
Escreva um trecho de programa em ASM86 devolva no registrador CL a paridade do
contedo de AX, isto , se o nmero de 1s em AX for mpar, CL=0, e CL=1, caso
contrrio.
12 Questo:
Voc tem uma regio da memria no segmento apontado por DS do tipo:
BUFFER DB 80 DUP(?)
onde so armazenados strings de caracteres vindos de um teclado. Um string pode
ter no mximo 80 caracteres e sempre terminado pelo caracter "CR" (0DH).
Escreva uma subrotina em ASM86 que determine o tamanho do string desta regio.
Admita que os registradores de segmento esto convenientemente carregados.
13 Questo:
A tabela abaixo construda de tal maneira que o contedo de i-simo elemento
exatamente o correspondente cdigo EBCEDIC de i, onde i est codificado em
ASCII.
CONV_TAB
DB
64 DUP(0H)
DB
1
20H
DB
9
DUP(0H)
2
Nibble o termo em ingls que denota os quatro bits de cada uma das metades de um byte.
47
DB
7
DB
9
DB
8
DB .....
'','.','<','(','+',0h,'&'
DUP(0H)
'!','$','*',')',';',' ','-','/'
Voc tem ainda duas regies da memria no segmento apontado por DS do tipo:
BUFFER_ASCII
DB 80 DUP(?)
BUFFER_EBCDIC DB 80 DUP(?)
Na primeira regio so armazenados strings de caracteres vindos de um teclado. Um
string pode ter no mximo 80 caracteres e sempre terminado pelo caracter "CR"
(0DH). Escreva um programa em ASM86 que coloque na segunda regio de
memria o string produzido pelo teclado, devidamente traduzido para o cdigo
EBCDIC.
14 Questo:
Embora o 8086/8088 possua instrues de multiplicao e diviso inteira, escreva
um programa (MULT) que multiplique dois nmeros inteiros sem sinal m,
armazenado em AH, e k, armazenado em AL, utilizando o seguinte algoritmo
MULT(m,k)=[(k x 20 x m0]+[(k x 21 x m1]+...[(k x 27 x m7]
O resultado deve estar no registrador AX.
15 Questo:
Escreva um programa que divida o contedo de AX pelo contedo de AL, utilizando
algoritmo anlogo ao do exerccio anterior, sem usar as instrues de diviso do
8086/8088. O quociente deve ser colocado em AL e o resto em AH.
16 Questo:
Escreva uma rotina (SROT) que tome o parmetro de entrada, um valor de 16 bits, e
troque de posio o byte mais e o byte menos significativo, retornando este valor em
AX. O parmetro de entrada passado para a subrotina SROT pelo programa
principal atravs da pilha, utilizando o mecanismo de passagem de parmetros visto
neste material.
17 Questo:
Escreva uma subrotina (TWOCP) em ASM-86 que calcule o complemento de dois de
um valor de 32 bits contido nos registradores DX:AX. O valor complementado deve
retornar no prprio par de registradores DX:AX. O contedo dos demais
registradores no pode ser modificado por TWOCP.
18 Questo:
Escreva uma subrotina (LOG) em ASM-86 que calcule o ln(x+1). O valor de x um
nmero inteiro menor do que 256, expresso em 16 bits e passado a LOG pela
ltima reviso Ago/2007
48
pilha, usando o mtodo apresentado neste material. O resultado dever ser devolvido
em 16 bits ao programa principal no registrador AX. Utilize a aproximao de Taylor:
x2 x3 x 4 x5
ln( x + 1) = x
+
+
2
3
4
5
Voc j dispe da subrotina POWER que eleva o contedo do primeiro parmetro,
ao valor do segundo parmetro retornando o resultado em AX. Ambos os parmetros
so valores inteiros menores do que 256,expressos em 16 bits, passados atravs da
pilha. POWER no altera o contedo de nenhum registrador a menos de AX. Se
ocorrer overflow, seu programa deve retornar o valor zero. Crie uma varivel
temporria que contenha os valores parciais do clculo do logaritmo.
19 Questo:
Escreva uma rotina (INTER) em ASM-86 que determine a interseco entre dois
conjuntos de nmeros de 8 bits. Os parmetros de entrada so todos expressos em
16 bits e so passados rotina na seguinte ordem: endereo inicial do vetor
contendo o primeiro conjunto, nmero de elementos do primeiro conjunto, endereo
inicial do vetor contendo o segundo conjunto, nmero de elementos do segundo
conjunto, endereo inicial do vetor contendo o conjunto interseco. Alm disso, a
subrotina deve retornar em AX a cardinalidade do conjunto interseco. Admita que
no h repeties de nmeros num mesmo conjunto, e que ambos os conjuntos tm
pelo menos um elemento.
20 Questo:
Escreva a rotina (MEDIA) em ASM-86 que calcule a mdia de n nmeros (x1, x2, ...,
xn) inteiros, sem sinal, expressos em um byte. Os parmetros - endereo a partir de
onde esto armazenados os nmeros e n - so expressos em 16 bits e so
passados a MEDIA pela pilha, conforme a conveno vista em aula. O resultado, de
16 bits, deve ser passado ao programa principal pelo registrador AX. O flag Carry,
dever quando setado que houve overflow.
21 Questo:
Escreva uma rotina (SORT) em ASM-86 que faa o sort dos bytes contidos num
determinado vetor. O endereo inicial do vetor, bem como o nmero de elementos
deste vetor, so passados rotina pela pilha. Os elementos do vetor so nmeros
inteiros com sinal. Utilize variveis auxiliares locais.
22 Questo:
Escreva a rotina MAXIMO em ASM86 que determine o maior de um conjunto de n
nmeros inteiros sem sinal expressos em 16 bits. O valor de n, expresso em 16 bits,
e os n bytes so passado a MAXIMO pela pilha, conforme o mtodo discutido neste
material. O maior valor encontrado deve retornar no registrador AX. Escreva a rotina
de modo que todos os parmetros de entrada sejam retirados da pilha antes de
retornar ao programa principal. Utilize uma varivel local para conter o valor mximo
temporrio.
ltima reviso Ago/2007
49
ADD_NEXT:
SUB AX,AX
MOV CX,25
MOV SI,50
SUB SI,2
ADD AX,TABLE[SI]
LOOP ADD_NEXT
25 Questo
Repita o exerccio anterior para a rotina abaixo. Este programa controla um canal de
comunicao assncrono.
USART_DATA EQU 0FF0H
USART_STAT EQU 0FF2H
CHAR_IN
AGAIN:
CHAR_IN
PROC NEAR
MOV DX,USART_STAT
IN
AL,DX
AND AL,2
JZ AGAIN
MOV DX,USART_DATA
IN
AL,DX
RET
ENDP
26 Questo
O programa abaixo um gerador de nmeros aleatrios. Repita o exerccio anterior
para este programa.
SAVE
RANDOM
DW ?
PROC NEAR
MOV CX,2053
MUL CX
ADD AX,13849
50
MOV SAVE,AX
SUB DX,DX
MOV CX,6
DIV CX
MOV AX,DX
RET
RANDOM
ENDP
27 Questo:
O programa abaixo calcula o fatorial de um nmero maior do que zero colocado em
AX. Estime o tempo de execuo da rotina abaixo em funo do contedo de AX.
Admita que os acessos a dados esto afetados de ciclos de espera, conforme a
tabela abaixo:
leitura
escrita
dados na pilha
1
2
dados fora da pilha
3
4
FATORIAL
ACABOU:
FATORIAL
PROC
CMP
JE
PUSH
DEC
CALL
POP
MUL
RET
ENDP
NEAR
AX,1
ACABOU
AX
AX
FATORIAL
BX
BX
28 Questo:
Nas subrotinas descritas abaixo, ALFA uma constante. Estime o tempo de
execuo das subrotinas em funo de ALFA, desde o instante em que inicia sua
execuo at o momento em que ocorre o retorno ao programa principal. Observe se
vale a pena utilizar as instrues de manipulao de string neste caso, do ponto de
vista do desempenho. Admita que cada acesso de leitura ou escrita a dados
afetado respectivamente por um ou dois ciclos de espera.
VERSAO_1
VOLTA:
PROC
NEAR
MOV
CX,ALFA
SUB BL,BL
XOR BL,[SI]
VERSAO_2
PROC
NEAR
MOV CX,ALFA
CLD
VOLTA:
51
SUB BL,BL
LODSB
VERSAO_1
INC SI
DEC CX
JNZ VOLTA
RET
ENDP
XOR BL,AL
LOOP VOLTA
RET
VERSAO_2
ENDP
29 Questo:
Escreva seqncias de instrues equivalentes a cada uma das instrues de
manipulao de string. Determine em seguida o tempo de execuo da instruo de
"string" e da seqncia equivalente. Compare os resultados.
52