Dúvidas para a PF

9 views
Skip to first unread message

Guilherme Bomfim

unread,
Dec 14, 2010, 9:47:35 PM12/14/10
to Comp-Prog
Bom , vou abrir o tópico de dúvidas para a pf.

Minha dúvida 1 - slide-aula-9 tem um exemplo de deslocamento de
bytes. (slide 12).

lá o exercicio mostra SARL %cl , %eax . Mas pelo que eu fiz, utilizei
SARL %ecx, %eax e não sei se fiz certo. Pelo que diz no slide 10 ,
tópico 2:

"Como a quantidade de deslocamento deve estar entre 0 e 31,
apenas os 5 ultimos bits do argumento \k" s~ao considerados"

Fiquei em dúvida se posso usar como argumento de deslogamento %ecx ,
já que o resto é ignorado, ou tenho que usar %cl mesmo.

Fernando Silva

unread,
Dec 15, 2010, 3:21:14 AM12/15/10
to comp...@googlegroups.com
Guilherme,

Teria que pegar o manual para confirmar, mas pelo que eu pesquisei rapidamente aqui, primeiramente pela frase que tem no slide:

O argumento \k" pode ser um valor imediato ou registrador de um byte (ex., %cl)

Isso dá a entender que só pode registrador de 1 byte.

E pelo que eu me lembro, e andei confirmando no google, na arquitetura de 16 bits do intel, o único registrador que podia usar era o próprio CL, mas infelizmente eu não sei te confirmar se é o caso aqui, derepente alguém que possua o livro consiga.

Silvana Rossetto

unread,
Dec 15, 2010, 6:18:21 AM12/15/10
to comp...@googlegroups.com
Oi  Guilherme,

A instrução SAR requer que o operando com o número de bits a ser deslocado seja um valor imediato ou o registrador cl
(ocorrerá um erro de compilação se o argumento for passado de outra forma)

att,
Silvana

2010/12/15 Fernando Silva <fms...@gmail.com>

Guilherme Bomfim

unread,
Dec 15, 2010, 8:35:42 AM12/15/10
to Comp-Prog
Obrigado.

Daqu a pouco posto mais dúvidas.

On Dec 15, 9:18 am, Silvana Rossetto <silv...@dcc.ufrj.br> wrote:
> Oi  Guilherme,
>
> A instrução SAR requer que o operando com o número de bits a ser deslocado
> seja um valor imediato ou o registrador cl
> (ocorrerá um erro de compilação se o argumento for passado de outra forma)
>
> att,
> Silvana
>
> 2010/12/15 Fernando Silva <fms2...@gmail.com>
>
>
>
> > Guilherme,
>
> > Teria que pegar o manual para confirmar, mas pelo que eu pesquisei
> > rapidamente aqui, primeiramente pela frase que tem no slide:
>
> > O argumento \k" pode ser um valor imediato ou registrador de um byte (ex.,
> > %cl)
>
> > Isso dá a entender que só pode registrador de 1 byte.
>
> > E pelo que eu me lembro, e andei confirmando no google, na arquitetura de
> > 16 bits do intel, o único registrador que podia usar era o próprio CL, mas
> > infelizmente eu não sei te confirmar se é o caso aqui, derepente alguém que
> > possua o livro consiga.
>

Guilherme Bomfim

unread,
Dec 15, 2010, 9:16:16 AM12/15/10
to Comp-Prog
Surgiu mais uma dúvida aqui.

Acho que essa é de facil resposta.

sobre rotinas recursivas:
Para uma rotina recursiva, eu aloco antes do começo da chamada dela um
espaço de memória referente aos argumentos que a possível recursão
precisará, certo?

pergunta 1 - esse tamanho pode ser de acordo com o tamanho dos
argumentos + o espaço de retorno (4 * n argumentos + 4 do
retorno) ...correto?

2 - no slide aula 13 , slide 4, antes de chamar de fato a função
recursiva, o programa aloca o argumento em %eax, (%esp) ...eu n
deveria alocar em 4(%esp) , já que eu preciso de 4 espaços de memória
para o retorno da minha função resursiva?

Guilherme Bomfim

unread,
Dec 15, 2010, 11:00:58 AM12/15/10
to Comp-Prog
Continuando as dúvidas

Slide aula 14 - slide 24/25 .
Char f ; long long g;

É preciso alocar 7 de espaço dpois do char f para que o longlong g
começe numa posiçao de memória multipla de 8...que 'e o tamanho
dele..correto?

Fernando Silva

unread,
Dec 15, 2010, 11:16:55 AM12/15/10
to comp...@googlegroups.com
Guilherme,

Acho que você está fazendo confusão, não é uma prática muito comum se retornar valores de função através da pilha, é possível de fazer, mas não é o mais usual, uma vez que se pode usar o registrador %EAX para isso, por exemplo, que é uma solução mais simples, inclusive é o caso do código do slide 4 da aula 13.

Tendo dito isso, vou comentar sobre suas dúvidas 1 de cada vez:

1) Normalmente o espaço que se aloca na pilha, durante uma função recursiva é feito para se ter uma área de memória livre, caso você precise usar, e não para alocar os parametros na hora da recursão, até porque não tem como se garantir a quantidade de vezes que a função vai realizar a recursão.

2) No caso, aloca-se para (%ESP), pois o valor de EAX vai passar a ocupar as posições de memórias referentes a:
ESP / ESP+1 / ESP + 2 / ESP +3
Se você fizesse, 4(%ESP), ele ocuparia:
ESP+4 / ESP+5 / ESP+6 / ESP+7

3) No caso, sim, são incluidos 7 bytes no alocamento do f para manter o alinhamento com o g.

Guilherme Bomfim

unread,
Dec 15, 2010, 11:23:18 AM12/15/10
to Comp-Prog
Valeu fernando. entendi oq vc falou da minha confusão.

talvez por isso tenha surgido minha dúvida relativa ao número 2.

Obrigado.

Daki a poko tem + haha

On Dec 15, 2:16 pm, Fernando Silva <fms2...@gmail.com> wrote:
> Guilherme,
>
> Acho que você está fazendo confusão, não é uma prática muito comum se
> retornar valores de função através da pilha, é possível de fazer, mas não é
> o mais usual, uma vez que se pode usar o registrador %EAX para isso, por
> exemplo, que é uma solução mais simples, inclusive é o caso do código do
> slide 4 da aula 13.
>
> Tendo dito isso, vou comentar sobre suas dúvidas 1 de cada vez:
>
> 1) Normalmente o espaço que se aloca na pilha, durante uma função recursiva
> é feito para se ter uma área de memória livre, caso você precise usar, e não
> para alocar os parametros na hora da recursão, até porque não tem como se
> garantir a quantidade de vezes que a função vai realizar a recursão.
>
> 2) No caso, aloca-se para (%ESP), pois o valor de EAX vai passar a ocupar as
> posições de memórias referentes a:
> ESP / ESP+1 / ESP + 2 / ESP +3
> Se você fizesse, 4(%ESP), ele ocuparia:
> ESP+4 / ESP+5 / ESP+6 / ESP+7
>
> 3) No caso, sim, são incluidos 7 bytes no alocamento do f para manter o
> alinhamento com o g.
>
> Em 15 de dezembro de 2010 14:00, Guilherme Bomfim
> <guilherme...@gmail.com>escreveu:

Rodrigo Ney

unread,
Dec 15, 2010, 2:38:27 PM12/15/10
to comp...@googlegroups.com
Fernando, teria como você explicar o que cada registrador deve guardar de novo quando eu chamo o int para leitura, escrita, abrir arquivo, fechar arquivo?
Que nem você me explicou no lci antes da p2!
Abraços

Fernando Silva

unread,
Dec 15, 2010, 2:51:51 PM12/15/10
to comp...@googlegroups.com
Rodrigo, vamos lá:

Lembrando, as interrupções de leitura e escrita, se referem sempre a arquivos, e para acessar um arquivo, nós precisamos informar o NAA(Número de Acesso ao Arquivo) de tal arquivo, que é o que a função de abrir arquivo retorna, ou que podemos usar os valores da entrada padrão(0 - Teclado) e da saída padrão(1 - Monitor), então os registradores e suas funções são como segue:

OBS: Lembrando que o Retorno é sempre em EAX

Leitura (Read) :

EAX = 3
EBX = NAA
ECX = Ponteiro para posição da memória aonde ficará salvo os dados lidos
EDX = Número de bytes a serem lidos
Retorno = Número de bytes que realmente foram lidos

Escrita (Read) :

EAX = 4
EBX = NAA
ECX = Ponteiro para posição da memória aonde estão os dados a serem escritos
EDX = Número de bytes a serem escritos
Retorno = Número de bytes que realmente foram escritos

Abrir (Open) :

EAX = 5
EBX = Poteiro para posição de memória aonde está a string do nome do arquivo
ECX = Bits de acesso ao arquivo (0 - Só leitura / 1 - Só escrita / 2 - Leitura & Escrita / ...)
EDX = Premissão de acesso ao arquivo(dentro do linux)
Retorno = NAA

Fechar (Close):

EAX = 6
EBX = NAA

Guilherme Bomfim

unread,
Dec 15, 2010, 3:34:18 PM12/15/10
to Comp-Prog
Dúvida que surgiu aki, e essa é bem simples

lista 2 - questao 4
no gabarito está

xorl $1 , %eax
andl $1, %eax


porém eu pensei em usar apenas andl $1 , %eax . Que seria , caso o
ultimo bit fosse 1 , retornaria 1 , caso contratio 0.

agora pq ele usa o xorl ?

Fernando Silva

unread,
Dec 15, 2010, 3:37:51 PM12/15/10
to comp...@googlegroups.com
No caso, a função do gabarito, usa o XOR $1, %EAX para inverter o valor do ultimo bit do número, porque o que eu quero é que ÍMPAR retorne 0, ou seja, quando o ultimo bit for 1, retorne 0, e quando for PAR, retorne 1, que é se o ultimo bit for 0, retorne 1, que no caso é o contrário do que você queria fazer...

Guilherme Bomfim

unread,
Dec 15, 2010, 3:40:47 PM12/15/10
to Comp-Prog
Entendi. é pq meu raciocinio foi usar algum outro registrador de fato
analisar se era par ou impar.. e dpois setar zero.

On Dec 15, 6:37 pm, Fernando Silva <fms2...@gmail.com> wrote:
> No caso, a função do gabarito, usa o XOR $1, %EAX para inverter o valor do
> ultimo bit do número, porque o que eu quero é que ÍMPAR retorne 0, ou seja,
> quando o ultimo bit for 1, retorne 0, e quando for PAR, retorne 1, que é se
> o ultimo bit for 0, retorne 1, que no caso é o contrário do que você queria
> fazer...
>
> Em 15 de dezembro de 2010 18:34, Guilherme Bomfim
> <guilherme...@gmail.com>escreveu:

Douglas Coutinho

unread,
Dec 15, 2010, 5:26:02 PM12/15/10
to comp...@googlegroups.com
Eu tenho uma:
nos slides da aula 16, slide 24, falando das falhas, diz "Se for corrigida, permite que o programa seja retomado sem perda de continuidade (ex., "falha de p agina"), nesse caso o endere co de retorno aponta para a instrução que causou a falha"

enquanto no gabarito na P2, questão2, letra b diz "permitindo que o programa retome
o processamento (instrução seguinte) sem perda de continuidade"

afinal, quando ocorre uma falha, o processamento volta na instrução que causou a falha ou a instrução seguinte?

Stefan Teixeira

unread,
Dec 15, 2010, 5:30:35 PM12/15/10
to comp...@googlegroups.com
Pelo que eu saiba, é o seguinte: vc tá numa instrução, aí ocorre uma falha, se ela for corrigida, vc vai continuar na instrução que tava antes...

Fernando Silva

unread,
Dec 15, 2010, 5:32:02 PM12/15/10
to comp...@googlegroups.com
Se ocorre um falha em uma instrução, e a interrupção consegue tratá-la, a instrução é reexecutada, como indica o esquema do slide 25 da aula 16.

André Lessa Tobar

unread,
Dec 15, 2010, 6:34:20 AM12/15/10
to comp...@googlegroups.com
Eu tenho uma duvida tb. Não entendi muito bem a questão 1 da P2. ele faz um ANDL com 0x800000001, eu entendo que o bit mais significativo é relacionado com o fato de ser positivo e negativo, e o bit menos significativo tem relaçao com o fato de ser par ou ímpar, e no meio vai zerar pq fez andl com 0 , mas pq o jle depois ?

Fernando Silva

unread,
Dec 15, 2010, 7:56:46 PM12/15/10
to comp...@googlegroups.com
André,

Primeiro desculpa, mas a sua mensagem tinha sido barrada pelo filtro de spam do grupo(vai entender...) e eu só percebi agora.

Quanto a dúvida:

O JLE vai fazer o desvio caso o resultado do andl seja igual a Zero(número par), ou caso ele seja negativo, ou seja, ele engloba todos os resultados que não são o que você quer.
Reply all
Reply to author
Forward
0 new messages