Duvida no Lab2

1 view
Skip to first unread message

magno ferreira

unread,
Dec 3, 2010, 2:41:31 PM12/3/10
to comp...@googlegroups.com
Professora, [ou qm já tiver feito :P]
Na Atividade 2.4
    Não estou conseguindo passar os parametros pra a subrotina printchar1
    Pelo q eu entendi, era só empilhar os parametros na ordem e chamar a subrotina..
    mas não imprime nada...
eu estou errando na hora de empilhar? ou tem algo mais pra fazer?


agradeço desde já
 

--
*
{agf}

Fernando Silva

unread,
Dec 3, 2010, 3:28:57 PM12/3/10
to comp...@googlegroups.com
Magno,

Basta empilhar os argumentos, se puder posta o seu código para eu tentar dar uma olhada no que pode estar errado.

magno ferreira

unread,
Dec 3, 2010, 4:06:50 PM12/3/10
to comp...@googlegroups.com
entao Fernando,
do pc q eu estou agora toh sem acesso pra testar mas eu tava empilhando nessa ordem:

chamada de escrita em arquivo: 4
arquivo para escrita: stdout: 1
endereco do buffer
tamanho do buffer


é isso msm?
 e o tamanho do buffer? acho q posso estar errando nisso tb tentei 1,2,4 e deu ruim

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



--
*
{agf}

Fernando Silva

unread,
Dec 3, 2010, 4:15:04 PM12/3/10
to comp...@googlegroups.com
Bem, essa ordem que você falou está certa, se no caso o tamanho do buffer for o mais abaixo na pilha(no caso o que foi empilhado primeiro) e o código da interrupção de escrita foi empilhada por ultimo(mais acima na pilha).

Quanto ao tamanho do buffer, ele deveria ser igual ao número de caracteres que você quer imprimir, uma vez que cada char ocupa um byte.

magno ferreira

unread,
Dec 3, 2010, 4:29:39 PM12/3/10
to comp...@googlegroups.com

então o tamanho q eu passei esta errado mas msm assim ele deveria imprimir algo...
qd eu puder irei testar de novo e ver o q estou passando errado

brigadão pela ajuda
2010/12/3 Fernando Silva <fms...@gmail.com>



--
*
{agf}

Rafael Souza

unread,
Dec 4, 2010, 8:10:38 PM12/4/10
to comp...@googlegroups.com
Eu também estou tendo uma certa dificuldade aqui. Como funciona a passagem de parâmetros para essas chamadas de funções (printchar, printnum, etc...)? Acho que estou errando algo em relação a isso... então caso alguem possa responder fico grato :)
--
Carlos Rafael Baur de Souza

Fernando Silva

unread,
Dec 5, 2010, 4:52:37 AM12/5/10
to comp...@googlegroups.com
A passagem de parâmetros para essas funções é feita através da pilha, o que tem que ser observado é quais são os parâmetros de cada uma, e em que ordem você terá que empilhar eles.

Rafael Souza

unread,
Dec 5, 2010, 9:00:57 AM12/5/10
to comp...@googlegroups.com
Então... pro caso do printchar1 eu consegui fazer certinho, pois passei os parâmetros como de costume em (%esp), 4(%esp), 8(%esp) etc e aí na subrotina ele pega os argumentos em 8(%ebp), 12(%ebp) e tal .... 

Mas nao consegui entender muito bem como funciona no caso da "printchar" ou "printnum" em q ele nao usa %ebp.

Fernando Silva

unread,
Dec 5, 2010, 9:31:11 AM12/5/10
to comp...@googlegroups.com
Rafael,

Vou escrever o código do prog1.s que é aonde está o printnum para tentar explicar:

.data
S2:    .int    10, 20, 30, 40

.text
.globl    main
main:   pushl    %ebx        /* salva ebx */
           movl    $0, %ebx    /* ebx = 0; */
           movl    $S2, %ecx    /* ecx = &S2; */
L1:    cmpl    $4, %ebx    /* if (ebx == 4) ? */
         je    L2        /* goto L2 */
         movl    (%ecx), %eax    /* eax = *ecx; */
         call    printnum    /* imprime valor de eax */
         addl    $1, %ebx    /* ebx += 1; */
         addl    $4, %ecx    /* ecx += 4; */
         jmp    L1        /* goto L1; */
L2:    movl    $0, %eax    /* eax = 0;  (valor de retorno) */
        popl    %ebx        /* restaura ebx */
        ret            /* retorna */

/* funcao auxiliar para imprimir o valor armazenado em eax. */
S1:    .string "%d\n"        # string de formato para printf
printnum:
    pushl    %ecx
    pushl    %ebx
    pushl    %eax
    pushl    $S1
    call    printf
    addl    $8, %esp
    popl    %ebx
    popl    %ecx
    ret

A diferença entre o que o printnum faz e o que o printchar1 fazia é que, enquanto o printchar1 chama a rotina de interrupção para imprimir uma cadeia de caracteres, o printnum chama a função printf do C.
Então, da forma com que o printchar1 foi feito, você passava, antes de chamar o printchar1, como parâmetros, os mesmos parâmetros que ele usa para chamar a interrupção.

Agora, o printnum, da forma como ele foi feito acima, tudo que ele precisa, é que o valor do inteiro que você quer imprimir esteja no EAX antes de você chamar a função. Se você observar a função, ela cuida para empilhar o que é necessário para a chamada do printf do C (repare também que da forma que ela foi feita, só imprime um número de cada vez).

No caso o printchar do prog2.s segue o mesmo conceito do printnum, só que imprimindo 1 char por vez, ao invés de 1 inteiro.
Reply all
Reply to author
Forward
0 new messages