Comunidade OSDevBrasil.net
Maio 22, 2012, 06:21:41 *
Bem-vindo, Visitante. Por favor faça o Login ou Registro.

Login com nome de usuário, senha e duração da sessão
Notícias: Anuncie a nossa comunidade a amigos, fóruns...
 
   Home   Ajuda Pesquisa Login Registrar  
Páginas: [1]
  Imprimir  
Autor Tópico: [Ajuda] VAMOS CONSTRUIR UM COMPILADOR!  (Lida 731 vezes)
Bencz
OS Full Member
***

Karma: 0
Mensagens: 112



Ver Perfil
« : Setembro 04, 2009, 05:11:10 »

eu ja terminei de escrever o os cod la dos tutoriais, mas como q eu poderia criar por exemplo o comando Print ?
Registrado



Mounter
Administrador
OS Sr. Member
*****

Karma: 12
Mensagens: 432


mrjostz@hotmail.com
Ver Perfil WWW Email
« Responder #1 : Setembro 04, 2009, 08:57:12 »

No caso você está fazendo o compilador certo?

O comando print seria algo como uma palavra chave, você teria que criar a função que faz o print e injeta-la como uma runtime da linguagem, assim ela seria incorporada ao programa e o compilador iria imitir uma instrução do tipo call print e antes disso ele iria por o ponteiro para a string na pilha... caso seja um int nos argumentos, ele iria emitir um call print_int, exemplo:
Código:
print "Escrevendo ", i, " palavras ";

Geraria:
Código:
push string_1 ; "Escrevendo "
call print_string
add esp, 4
push int_i
call print_int
add esp, 4
push string_2 ; " palavras "
print_string
add esp, 4

 
Registrado

╔╗╔╦══╦╗╔╦══╦╗
║╚╝║╔╗║╚╝║╔╗║║
║╔╗║╠╣║╔╗║╠╣╠╣
╚╝╚╩╝╚╩╝╚╩╝╚╩╝

Projeto SOmBRA - http://code.google.com/p/projeto-sombra

S.O.: Ubuntu 10.04
Browser: Google Chrome 10

Bencz
OS Full Member
***

Karma: 0
Mensagens: 112



Ver Perfil
« Responder #2 : Setembro 04, 2009, 09:56:27 »

No caso você está fazendo o compilador certo?

O comando print seria algo como uma palavra chave, você teria que criar a função que faz o print e injeta-la como uma runtime da linguagem, assim ela seria incorporada ao programa e o compilador iria imitir uma instrução do tipo call print e antes disso ele iria por o ponteiro para a string na pilha... caso seja um int nos argumentos, ele iria emitir um call print_int, exemplo:
Código:
print "Escrevendo ", i, " palavras ";

Geraria:
Código:
push string_1 ; "Escrevendo "
call print_string
add esp, 4
push int_i
call print_int
add esp, 4
push string_2 ; " palavras "
print_string
add esp, 4

 

Obrigado Sorridente
« Última modificação: Dezembro 13, 2009, 07:30:47 por Bencz » Registrado



Bencz
OS Full Member
***

Karma: 0
Mensagens: 112



Ver Perfil
« Responder #3 : Dezembro 13, 2009, 07:30:22 »

Olá, eu estou tentando à um bom tempo tentando fazer com que o programa salve a saída em um txt, mas eu não estou conseguindo, caso alguem saiba ou possa me ajudar com esse esse problema eu agradeço.
Registrado



Mounter
Administrador
OS Sr. Member
*****

Karma: 12
Mensagens: 432


mrjostz@hotmail.com
Ver Perfil WWW Email
« Responder #4 : Dezembro 13, 2009, 07:11:13 »

A função que devolve os códigos assembly gerados é o emit(char *s, ...), então você teria que fazer essa função mandar os dados para um arquivo (vfprintf), só não esqueça de abrir e depois fechar o arquivo...
Registrado

╔╗╔╦══╦╗╔╦══╦╗
║╚╝║╔╗║╚╝║╔╗║║
║╔╗║╠╣║╔╗║╠╣╠╣
╚╝╚╩╝╚╩╝╚╩╝╚╩╝

Projeto SOmBRA - http://code.google.com/p/projeto-sombra

S.O.: Ubuntu 10.04
Browser: Google Chrome 10

Bencz
OS Full Member
***

Karma: 0
Mensagens: 112



Ver Perfil
« Responder #5 : Dezembro 13, 2009, 07:24:43 »

A função que devolve os códigos assembly gerados é o emit(char *s, ...), então você teria que fazer essa função mandar os dados para um arquivo (vfprintf), só não esqueça de abrir e depois fechar o arquivo...

ja tentei fazer isso, mas ele salva isso aqui "йІ" X_X

segue oque eu fiz:
OBS: faz muito tempo que eu não mexo com C.

int main()
{
   FILE *teste;
   teste = fopen("teste.txt", "w");
   init();
   expression();
   fprintf(teste, emit);
   fclose(teste);
   system("pause");
   return 0;
}
Registrado



Mounter
Administrador
OS Sr. Member
*****

Karma: 12
Mensagens: 432


mrjostz@hotmail.com
Ver Perfil WWW Email
« Responder #6 : Dezembro 13, 2009, 07:32:22 »

Claro que ele vai saltar isso ai, você está fazendo errado, mandando ele imprimir no arquivo o ponteiro pra função emit... é para você alterar a função...

Código:
/* emite uma instrução seguida por uma nova linha */
        void emit(char *fmt, ...)
       
        {
                va_list args;
       
                putchar('\t');
       
                va_start(args, fmt);
                vfprintf(file, fmt, args);
       
                va_end(args);
       
                putchar('\n');
       
        }
Registrado

╔╗╔╦══╦╗╔╦══╦╗
║╚╝║╔╗║╚╝║╔╗║║
║╔╗║╠╣║╔╗║╠╣╠╣
╚╝╚╩╝╚╩╝╚╩╝╚╩╝

Projeto SOmBRA - http://code.google.com/p/projeto-sombra

S.O.: Ubuntu 10.04
Browser: Google Chrome 10

Bencz
OS Full Member
***

Karma: 0
Mensagens: 112



Ver Perfil
« Responder #7 : Dezembro 13, 2009, 07:52:11 »

Claro que ele vai saltar isso ai, você está fazendo errado, mandando ele imprimir no arquivo o ponteiro pra função emit... é para você alterar a função...

Código:
/* emite uma instrução seguida por uma nova linha */
        void emit(char *fmt, ...)
       
        {
                va_list args;
       
                putchar('\t');
       
                va_start(args, fmt);
                vfprintf(file, fmt, args);
       
                va_end(args);
       
                putchar('\n');
       
        }

Sorridente

agora eu entendi, muito obrigado Sorridente
desculpe-me o incomodo.
Registrado



Bencz
OS Full Member
***

Karma: 0
Mensagens: 112



Ver Perfil
« Responder #8 : Dezembro 25, 2009, 11:41:49 »

Olá, hoje eu estava dando uma olhada no tutorial numero 10, e sobre o comando WRITE, hoje quando eu fui testar o assembly gerado pelo compilador, em um emulador, ele dava erro na seguinte linha ->

Citar
extrn READ:near, WRITE:near

O código completo é o seguinte ->

Citar
.model small
.stack
.code
extrn READ:near, WRITE:near
PROG segment byte public
        assume cs:PROG,ds:PROG,es:PROG,ss:PROG
NOTA1:  dw 0
NOTA2:  dw 0
MEDIA:  dw 0
BONUS:  dw 0
MAIN:
        mov ax, PROG
        mov ds, ax
        mov es, ax
L0:
        mov ax, word ptr NOTA1
        push ax
        mov ax, 0
        pop bx
        cmp bx, ax
        jl L2
        xor ax, ax
        jmp L3
L2:
        mov ax, -1
L3:
        push ax
        mov ax, word ptr NOTA1
        push ax
        mov ax, 10
        pop bx
        cmp bx, ax
        jg L4
        xor ax, ax
        jmp L5
L4:
        mov ax, -1
L5:
        pop bx
        or ax, bx
        push ax
        mov ax, word ptr NOTA2
        push ax
        mov ax, 0
        pop bx
        cmp bx, ax
        jl L6
        xor ax, ax
        jmp L7
L6:
        mov ax, -1
L7:
        pop bx
        or ax, bx
        push ax
        mov ax, word ptr NOTA2
        push ax
        mov ax, 10
        pop bx
        cmp bx, ax
        jg L8
        xor ax, ax
        jmp L9
L8:
        mov ax, -1
L9:
        pop bx
        or ax, bx
        jz L1
        call READ
        mov word ptr NOTA1, ax
        call READ
        mov word ptr NOTA2, ax
        jmp L0
L1:
        mov ax, word ptr NOTA1
        push ax
        mov ax, word ptr NOTA2
        pop bx
        add ax, bx
        push ax
        mov ax, 2
        pop bx
        xchg ax, bx
        cwd
        div bx
        mov word ptr MEDIA, ax
        mov ax, word ptr MEDIA
        call WRITE
        mov ax, word ptr MEDIA
        push ax
        mov ax, 5
        pop bx
        cmp bx, ax
        jge L10
        xor ax, ax
        jmp L11
L10:
        mov ax, -1
L11:
        jz L12
        mov ax, 1
        mov word ptr BONUS, ax
        jmp L13
L12:
        mov ax, -1
        mov word ptr BONUS, ax
L13:
        mov ax, word ptr BONUS
        call WRITE
        mov ax,4C00h
        int 21h
PROG ends
        end MAIN

agradeço pela ajuda Sorridente
Registrado



Mounter
Administrador
OS Sr. Member
*****

Karma: 12
Mensagens: 432


mrjostz@hotmail.com
Ver Perfil WWW Email
« Responder #9 : Dezembro 26, 2009, 03:10:24 »

Da erro porque ali é extern e não extrn, se for erro no tutorial mais tarde eu corrijo...
Registrado

╔╗╔╦══╦╗╔╦══╦╗
║╚╝║╔╗║╚╝║╔╗║║
║╔╗║╠╣║╔╗║╠╣╠╣
╚╝╚╩╝╚╩╝╚╩╝╚╩╝

Projeto SOmBRA - http://code.google.com/p/projeto-sombra

S.O.: Ubuntu 10.04
Browser: Google Chrome 10

Bencz
OS Full Member
***

Karma: 0
Mensagens: 112



Ver Perfil
« Responder #10 : Dezembro 29, 2009, 04:47:47 »

Da erro porque ali é extern e não extrn, se for erro no tutorial mais tarde eu corrijo...

Pomba, é verdade, é erro no tutorial Sorridente

mas continua sem funcionar
« Última modificação: Dezembro 29, 2009, 04:57:55 por Bencz » Registrado



Páginas: [1]
  Imprimir  
 
Ir para:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.16 | SMF © 2006-2009, Simple Machines XHTML 1.0 Válido! CSS Válido!