1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

Assembly alguem que me ajude!!

Discussão em 'Programação' iniciada por Thorax, 8 de Junho de 2004. (Respostas: 18; Visualizações: 4325)

  1. Thorax

    Thorax Power Member

    Boas pessoal. Sei que hoje em dia o assembly e pouco utilizado nas nossas programaçoes, mas ainda continua a ter muita importancia na nossa vida. Por tras de C++, VB, Pascal ... encontra-se sempre a linguagem assembly. Pois é, eu sou pouco novice nesta materia e gostaria que alguem me ajuda-se a fazer um pequeno programa em assembly. :003:
    O programa consiste num ALARME que no qual vai avisar alguma coisa (exemplo uma mensagem que devera aparecer no monitor) assim que atingir a hora introduzida pelo utilizador.
    Devo de utilizar o REAL TIME CLOCK que corresponde ao Int 70H. Sei tb que tenho de criar um programa residente mas isso nao é o meu problema. Pois é, tenho de apresentar esse programa daqui a poucas semanas nas nao estou a ver como devo de fazer. Se voces me ajudarem, fico bastante grato. :001:
     
  2. FASC

    FASC Power Member

    Assembly do 8086?


    Hugs.
     
  3. AVxAMD

    AVxAMD I fold therefore I AM

    Boas.
    Vais fazer isso em que compilador?

    VB
    Delphi
    C/C++
    Turbo Pascal
    Debug do MS-DOS
    Outro?

    Diz algo.
    Um grande abraço.
     
  4. redalert

    redalert Folding Member

    eu nas minhas aulas de microprocessadores dei assembly e usei o simulador do cpu "p3" (nao e pentium 3!!).


    aconselho-te a fazeres primeiro um fluxograma asm (ou seja um fluxograma que representa todos os passos do programa a fazer e tb com analise das flags do cpu.).


    busca aqui nos acetatos do grande Horta :D: http://digitais.ist.utl.pt/ec-im



    fika gud.

    ps: se kiseres aprender umas coisinhas de assembly avisa! :P
     
  5. Thorax

    Thorax Power Member

    FASC -> sim o assembly e baseado no 8086.

    XGLite-> o copilador que uso é o TASM seguido pelo LINK.Sao os programas que trabalho na escola.

    redalert---> queres dizer algoritmo para saber todos os passos que devo de fazer com o assembly, sim eu tenho mais ou menos feito a questao tenho dificuldades em implementar o codigo. alem de mais tenho de o entregar ate ao final da proxima semana penso eu ... e ando um coxe atrapalhado com outros trabalhos em c++ etc.. tudo projectos do 1 ano de faculdade..
    O meu maior problema é implementar o codigo. Como vou fazer activar o alarme a hora que o utilizador introduzir.. Como vou fazer com que ele apresente uma msg da alerta que o utilizador meteu como uma Alerta.. enfim soa essas pequenas coisas que me baralham.
    Se alguem tiver alguma ideia que diga ... fico atento a isso... :)
     
  6. redalert

    redalert Folding Member

    para isso tem k haver um periferico (tipo relogio) que detecte se ja ta na hora. se ja ta, activa uma interrupcao defenida por ti (executa uma funcao definida). se n tens periferico é fazer à-lá "old-fashion" usando CMP (compare ou SUB (substraccao e analisar a flag ZERO)) sucessivos decrementando (ou incrementando) um registo para queimar ciclos de relogio ate chegar a hora programada.




    tens k definir (declarar) uma string (ou word) no inicio do programa (tipo em C: char nome[40]; ) ou entao fazes um EQU (tipo em C: #define ALERTA atencao ligou alarme)




    este pseudo-codigo k apresentei é para o simulador p3 mas n deve ser muito diferente do assembly do 8086.

    espero ter ajudado.

    fika gud.
     
  7. redalert

    redalert Folding Member

    por acaso nao andas no ist? :D e k hoje a tarde ia a entrar pela porta da alameda e ouvi uns gajos k passavam a falar dum projecto kalker de um alarme blablabla (tinham pinta do ppl da leic :D)...
     
  8. greven

    greven Folding Artist

    Ahahah, isto é só pessoal do ist! Microprocessadores done that! :D Mas com o Serro a dar. :)

    Grande 8086, no meu último projecto era mesmo fazer um alarme...

    Boa sorte com isso.
     
  9. peter alien

    peter alien Power Member

    Uma vez que falaram sobre a linguagem assembly, pergunto-vos se sabem ou têm algum manual que explique como utilizar as mnemónicas que o Pentium 3 ou 4 possuem ?

    :)brigadã:)
     
  10. Thorax

    Thorax Power Member

    redalert---> Acho que o REAl TIME CLOCK que utiliza o IRQ 8 e é activado pelo interrupt 70H permite fazer tudo, desde activar o alarme, aos calculos em que o alarme deve de ser igual a hora do sistema etc e tal... o problema e conhecer bem o int70h etc e tal. eu ate tenho algo a explicar isso mas enfim.. acho que me faltam bases para a implementaçao do codigo.

    Em relaçao de eu andar no IST ... poix acho que se eu caso anda-se ai nao teria tantos problemas e teria melhores bases. Eu estudo no Instutito politecnico da Guarda (IPG) e isto é um projecto para ARquitectura de Computadores, em que no maximo de-mos 4 aulas sobre assembly ... enfim ... agora tenho de me desenrascar!

    greven--> Se caso poderes dizer algumas dicas do teu projecto agradecia-te. EU utlimamente ando atarefado com outros projectos e estou a ver este a ir pela agua abaixo!

    peter alien ---> Nesse aspecto queria muito ajudar-te mas sobre P3 e P4 e mnemónicas, nao tenho mesmo nada. Espero que alguem neste forum saiba de alguma coisa e que post aqui!
     
    Última edição: 11 de Junho de 2004
  11. FASC

    FASC Power Member

    Aí há uns tempos saquei do site da intel os white papers do Pentium Pro (meu antigo processador), entre as quais estavam as mnemónicas de programação suportadas pela CPU e flags. Já devem estar disponíveis para essas CPU's. Dá uma vista de olhos por lá.


    Hugs.
     
  12. peter alien

    peter alien Power Member

    Ok, eu vou dar uma olhadela, obrigadão FASC.
     
  13. redalert

    redalert Folding Member



    sabes kantas tive? 0 ZERO NULL \0 nicles-picles... o google sabe tudo... :D
     
  14. Thorax

    Thorax Power Member

    redalert---> LOL eu a pensar que estava mal mas afinal de contas ja estou a ver que alguem esteve bem pior...lol :P

    Ja fiz muitas pesquisas pela google e o maximo que consegui encontrar foi um relogio em assembly...encontrei tb muita informação sobre o int 70H e ate me pode ser util. mas em relaçao como fazer um alarme poix isso esta mesmo complicado. :(
     
  15. Swordfish

    Swordfish Power Member

    Heyas all...

    Um programa em assembly que introduzindo uma hora ele tenha que dar um alarme quando chegar a essa hora...

    Tirando a parte do int 70h que eu não dei nada este semestre só dei int 21h..

    Penso que já tenhas o algortimo para isso feito..ou seja uma coisa do género:

    (Pseudo-código)
    Código:
    hour = 2:30:25
    while ( hour != Real Time clock )
    {
         chama o int 70h;
    }
    salta fora do while e mostra a mensagem de erro;
    
    O que em assembly de 8086 deve ficar algo do género:

    Código:
            mov ax,hour;digamos que em ax temos o valor da hora de alarme
            ;digamos que em bx fica o valor da hora do Real Time clock
            int 70h;chamas o int 70h para ficares com o valor da hora no bx
    loop: cmp (ax, bx)
            jne loop
            ;aqui mostras a mensagem de erro com o int 21h ou com o int 10h
            ;a partir daqui já dependes se o programa deve pedir outra hora depois
            ;de mostrar o alarme...ou prosseguir com com o progama
            jmp loop ;se for para prosseguir com o progama
    
    O que deves ficar é com uma coisa deste género...pelo menos a mim é o que me parece mais lógico...

    Mas atenção, há que ter em conta o tempo que demoras a executar esse o ciclo em que vês se a hora é igual á aquela que introduzis-te, porque se demoras muito tempo pode acontecer o caso de não acertares na hora que queres, por exemplo:

    Se introduzires a hora 1:30:50.
    Se começares às 1:30:45, e se o ciclo te demorar 6 segundos a fazer, o que acontece é que quando ele te for fazer a verificação a hora local já está nas 1:30:51, ou seja perdeste a hora em que era suposto ele dar o alarme...

    Em principio não deves ter problemas porque os ciclos de relógio do processador são suficientemente rápidos para não perderes a hora...mas nunca se sabe...

    Alguma coisa...pergunta que logo se vê se dá para ajudar...Mas como disse o Sky Fox tens de ser tu a fazer o trabalho...até porque só deste 4 aulas de assembly o professor era capaz de estranhar se saísses com um programa demasiado "bom" digamos....

    Alguns link's que são capazes de ajudar:

    Art of Assembly

    Norton Guides-Linguagem

    Norton Guides-Interrputs

    Hasta all e espero ter ajudado...

    PS:Somos 2 que utilizamos este nick(eu mais para ver o fórum)...o Swordfish "real" não percebe nada disto(disto de asm do 8086 )....eu é que estou na FCT a tirar Engº Electro. e tive uma cadeira que é apenas Assembly de 8086 este semestre (Microprocessadores) link aqui
     
    Última edição: 12 de Junho de 2004
  16. Thorax

    Thorax Power Member

    Sky Fox--->obrigado pelo teu apoio, assim que poder contacto-te!

    Swordfish --> deste-me uma grande ajuda! :) Obrigado. vou começar a preparar o trabalho, assim que tiver ja alguma coisa feita eu coloco a ver as vossas opinioes.
     
  17. Swordfish

    Swordfish Power Member

    É o que é preciso...depois posta aí que é para ver se não precisamos de fazer correções a isso :)

    Hasta all [[]]
     
  18. Thorax

    Thorax Power Member

    Alarme Real time clock

    Caros amigos pois bem aqui estou eu de novo, nesta vez estou dedicado a 100% ao meu trabalho de assembly pois para quem ja nao se lembra :P trata-se de um Alarme. pois eu acabei de criar um codigo mas nao me esta a trabalhar como eu queria. >(
    So uma pequena nota, o alarme tem de ficar num programa residente.

    .386
    cseg segment use16
    main proc far
    assume cs:cseg
    mov dx,offset int4a
    mov ax, seg int4a
    mov ds,ax
    mov ah,25h
    mov al,4ah
    int 21h ;coloca o endereço da rotina int4a no vector de interrupt 4AH
    ;/////////////////////////////////////////////////////////////////////////////////

    ;DEFENIR O FORMATO A TRABALHAR (BCD)

    mov al,0bh
    out 70H,al
    in al,71h
    and al,00000010B
    out 71H,al

    ;PERGUNTAR A HORA DO ALARME

    mov ah,1 ;Fica a espera que o utilizador prime numa tecla
    int 21H
    sub al,'0' ;Converte o codigo ASCII em binario
    mov bl,al ;Coloca o valor de al no bl
    shl bl,4 ;Converte o codigo binario para BCD



    mov ah,1 ;Fica a espera que prime outra tecla
    int 21H
    sub al,'0'

    add bl,al ; 12 d = 0001 0010 bcd

    ;Acrescentar a Hora ao Real Time Clock

    mov al,05H
    out 70H,al ;Coloquei a hora do formato BCD no
    mov al,bl ; Real Time Clock corresondente as
    out 71H,al ; horas do Alarme = 05H

    ;Perguntar os Minutos do Alarme

    mov ah,1 ;Fica a espera que o utilizador prime numa tecla
    int 21H
    sub al,'0' ;Converte o codigo ASCII em binario
    mov bl,al ;Coloca o valor de al no bl
    shl bl,4 ;Converte o codigo binario para BCD



    mov ah,1 ;Fica a espera que prime outra tecla
    int 21H
    sub al,'0'


    add bl,al ; 12 d = 0001 0010 bcd

    ;Acrescentar os minutos ao Real Time Clock

    mov al,03H
    out 70H,al ;;Coloquei os minutos do formato BCD no
    mov al,bl ;; Real Time Clock corresondente as
    out 71H,al ;; horas do Alarme = 05H

    ;Defenir os Segundos do Alarme


    mov bl,00000000b

    ;Neste ultimo caso, o codigo BCD de 0 e igual ao binario

    ;Acrescentar os segundos ao Real Time Clock

    mov al,01H
    out 70H,al ;;Coloquei os segundos do formato BCD no
    mov al,bl ;; Real Time Clock corresondente as
    out 71H,al ;; horas do Alarme = 01H



    ;Colocar o Bit 5 do Status B a 1

    mov al,0bH
    out 70H,al ;; Activamos o Interrupt do Alarme
    in al,71H
    add al,00100010B
    out 71H,al

    ;IR ao Interrupt Mask Register e garantir k nao esta MASCARADO IRQ8 =A1H

    in al,0a1h
    and al,11111110B
    out 0a1h,al


    ;/////////////////////////////////////////////////////////////////////////////////
    mov dx,zseg
    mov ax,es
    sub dx,ax ;determina o numero de paragrafos para deixar em memoria
    mov ah,31h
    int 21h ;termina o programa deixando o residente em memoria
    main endp
    int4a proc far ; rotina de atendimento ao interrupt
    push ax
    push bx
    push cx
    push di
    push es ;faz o push de todos os registos que utiliza
    ;////////////////////////////////////////////////////////////////////////////

    ;sinal sonoro

    in al,61h
    add al, 11111111b
    out 61h,al


    ;/////////////////////////////////////////////////////////////////////////////
    pop es
    pop di
    pop cx
    pop bx
    pop ax ; restaura todos os registos usados
    iret ; termina a rotina de interrupt
    int4a endp
    cseg ends
    zseg segment use16
    zseg ends ; segmento para calcular o tamanho do programa
    end


    Ora bem, como o meu prof neste momento nao vai aparecer no instituto politecnico da guarda ate ao dia da entrega do trabalho, entao eu começei a tirar algumas duvidas pelo email. So que agora neste ultimo email que ele me mandou epa... fiquei mesmo as arranhas.... :007:
    Por isso vou postar o email que enviei ao prof e a seguinte resposta dele.


    ----------------email ------------


    Caro professor Luis Figueiredo
    Tenho alguns problemas no programa Alarme utilizando o Real Time Clock. Eu
    criei o programa mas gostava que o professor me desse uma ajuda uma vez que copilado nao existe erro mas quando chega a altura de chamar a mensagem de alarme ele nao executa. presumo que seja algum erro meu e por isso preciso que o professor dê uma revisao do programa e me diga o que estou a fazer mal e se estou a fazer mal, como he-de fazer para corrigir.
    Junto envio um ficheiro chamado residente1.ASM e o metodo de implementaçao das horas e minutos no dos é a seguinte:
    c:\hhmm
    Fico atento a sua resposta.
    Obrigado.

    -------resposta ao email---------

    1º Simplifique o código dos segundos
    2º Reveja o código da activação do interrupt de alarme. Olha bem para a tabela e para as instruções que usa.
    3º Na rotina de atendimento ao interrupt não invente. Não ponha nada que não saiba ou não entende o que faz. Faça primeiro o algoritmo e depois o código de acordo com esse algoritmo. :die:
    4º Pode acontecer em alguns sistemas que após a activação do interrupt de alarme este volte a ser activado em cada segundo que passa até ao fim do primeiro minuto. Pode resolver este problema se na rotina de atendimento desactivar o interrupt de alarme (bit5 do status B a 0).

    ----------------------------------

    Ok pessoal eu tenho de entregar este trabalho ate 3 feira e ainda nao esta a funcionar por isso peço a vossa ajuda para tentar resolver os problemas do meu codigo :)
     
    Última edição: 2 de Julho de 2004

Partilhar esta Página