Buscar

Lista de Exercícios - Arquitetura de Computadores II (Assembly)

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 4 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

Arquitetura de Computadores II
Primeira Lista de Exercícios
Prof. Adalberto Gualeve
1) Para cada uma das instruções a seguir, determine o sufixo apropriado baseado nos operandos
mov___ %eax, (%esp)
mov___ (%eax), %dx
mov___ $0xFF, %bl
mov___ (%esp,%edx), %dh
push__ $0xFF
mov___ %dx, (%eax)
pop___ %edi
2) Cada uma das linhas de código a seguir gera um erro quando é chamado o montador. Explique o
que há de errado em cada linha.
movb $0xF, (%bl)
movl %ax, (%esp)
movw (%eax), 4(%esp)
movb %ah, %sh
movl %eax, $0x123
movl %eax,%dx
movl %si, 8(%ebp)
3) Suponha que o registrador %eax contenha o valor x e o registrador %ecx contenha o valor de y.
Preencha a tabela abaixo com os valores que são armazenados em %edx para cada fórmula usada.
Instrução…………………………..Resultado…………….
leal 6(%eax), %edx _________
leal (%eax,%ecx), %edx _________
leal (%eax,%ecx,4), %edx _________
leal 7(%eax,%eax,8), %edx _________
leal 0xA(, %ecx, 4), %edx _________
leal 9(%eax,%ecx,2), %edx _________
4) Assuma que os seguintes valores estão armazenados na memória e registradores:
Endereço Valor Registrador Valor
0x100 0xFF %eax 0x100
0x104 0xAB %ecx 0x1
0x108 0x13 %edx 0x3
0x10c 0x11
Preencha a seguinte tabela mostrando os efeitos das instruções abaixo tanto nos
registradores quanto na memória.
Instrução Destino Valor
addl %ecx, (%eax) ________ ________
subl %edx, 4(%eax) ________ ________
imull 16, (%eax,%edx,4) ________ ________
incl 8 (%eax) ________ ________
decl %ecx ________ ________
subl %edx, %eax ________ ________
5) Suponha que você queira gerar o seguinte código em linguagem C:
int shift_left2_rightn( int x, int n ) {
x = x << 2;
x = x >> n;
return x;
}
O código abaixo é uma parte do código assembly que faz os deslocamentos e retorno do
resultado no registrador %eax. Duas operações foram omitidas e os parâmetros x e n
recebidos pela função estão nos endereços apontados por %esp nos deslocamentos 4 e 8
respectivamente. Preencha as instruções omitidas:
(1) movl 4(%esp), %eax ; Recebe x
(2) _____________________ ; x<<=2
(3) movl 8(%esp), %ecx ; Recebe n
(4) _____________________ ; x >>=n
6) O seguinte código C
int comp( data_t   a, data_t  b ) {
return  a COMP b ;
}
retorna uma comparação entre os argumentos a e b, definidos como tipo data_t. A
comparação é feita pela operação COMP. Suponha que “a” está em %edx e “b” está em
%eax. Para cada uma das seguintes instruções abaixo, determinar quais tipos de dados
data_t e que comparações COMP poderiam ser geradas pelo compilador. (Pode haver
várias respostas corretas; você deve listar todas elas.)
a)
cmpl %eax, %edx
setl %al
b)
cmpw %ax, %dx
setge %al
c)
cmpb %eax, %edx
setb %al
d)
cmpl %eax, %edx
setne %al
7) Nas listagens abaixo geradas por um desmontador, algumas informações foram substituídas por
Xs. Responda as seguintes questões sobre essas instruções:
a) Qual o alvo da instrução “je” abaixo?
804828f: 74 05 je XXXXXXX
8048291: e8 1e 00 00 00 call 80482b4
b) Qual o alvo da instrução “jb” abaixo?
8048357: 72 e7 jb XXXXXXX
8048359: c6 05 10 a0 04 08 01 movb $0x1, 0x804a010
c) Qual o endereço da instrução “mov” abaixo?
XXXXXX: 74 12 je 8038391
XXXXXX: b8 00 00 00 00 mov $0x0, %eax
d) No código a seguir, o alvo do jump está codificado no formato PC­relativo como um
número em complemento a dois de 4­bytes. A ordem dos bytes é little­endian. Qual o
endereço alvo do jump?
80482bf: e9 e0 ff ff ff jmp XXXXXXX
80482c4: 90 nop
8) Iniciando com o código C na seguinte forma:
int teste( int x, int y ) {
int val = _________;
if ( _________ ) {
if ( _________ )
val = _________ ;
else
val = _________ ;
}  else if ( _________ )
val = _________ ;
return val;
}
o gcc gera o seguinte código assembly:
movl 4(%esp), %edx
movl 8(%esp), %ecx
cmpl $­3, %edx
jge .L2
leal (%edx,%ecx), %eax
cmpl %ecx, %edx
jl .L4
movl %edx, %eax
imull %ecx, %eax
ret
.L2:
movl %ecx, %eax
xorl %edx, %eax
cmpl $2, %edx
jle .L4
movl %edx, %eax
subl %ecx, %eax
.L4:
ret
Preencha as expressões que faltam no código C.

Continue navegando