Página 1 de 1
Duvida com assembly!!!!

Enviado:
04 Nov 2006 07:49
por alex_david_lima
ola, pessoal, estou com duvida como fazer uma função de FOR em assmble, gostaria da ajuda da galera.
obrigado, deis de já
ALEX DAVID

Enviado:
04 Nov 2006 08:35
por zielpunkt
Alex, vc programa em C? Não poderia ser mais preciso na sua necessidade, tipo postar um trecho do código que quer desenvolver? Em assembly haveria alguns caminhos, mas assim fica meio difícil de deduzir o que vc precisa, ok.

Enviado:
04 Nov 2006 09:55
por alex_david_lima
ola, zielpunkt
ai vai estou programando em assembly, em C tem uma função que se chama FOR esta função executa um trecho do programa uma quantidade de vezes ate passar para proxima, função
#INCLUDE <P12F675.INC>
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT & _MCLRE_OFF & _CPD_OFF
; __CONFIG _CP_OFF & _CPD_OFF & _BODEN_OFF & _MCLRE_OFF & _WDT_OFF &_PWRTE_ON & _INTRC_OSC_NOCLKOUT
errorlevel -302 ; suppress banksel warning messages
; DEFINIÇÃO DE VARIÁVEIS
ORG 0X00
GOTO INICIO
ORG 0X04
GOTO INICIO
CBLOCK 0x20
CONT_AUX1
CONT_AUX2
DELAY1
DELAY2
DELAY3
counter
TEMPO0
TEMPO1
TEMPO2
ENDC
#define setbank0 bcf STATUS,RP0 ; Sel Bank 0
#define setbank1 bsf STATUS,RP0 ; Sel Bank 1
INICIO
setbank1
movlw B'100000'
movwf GPIO
MOVLW B'0000111'
MOVWF OPTION_REG
setbank0
MOVLW .255
MOVWF counter
MAIN
;INICIO DO FOR
goto half_step_drive
;OBJETIVO EXECUTAR A O goto half_step_drive POR UMA DETERMINADO QUANTIDADE DE VEZES
;FIM DO FOR
GOTO MAIN
VERIFICA
BTFSC GPIO,5
GOTO MAIN
CALL INVERTE2
GOTO MAIN
sub_tom:
MOVLW 0X00
MOVWF GPIO
MOVLW .50
CALL DELAY_MS
MOVLW B'010000'
MOVWF GPIO
MOVLW .50
CALL DELAY_MS
GOTO MAIN
half_step_drive:
MOVLW B'010100'
MOVWF GPIO
MOVLW .2
CALL DELAY_MS
MOVLW B'000100'
MOVWF GPIO
MOVLW .2
CALL DELAY_MS
MOVLW B'000110'
MOVWF GPIO
MOVLW .2
CALL DELAY_MS
MOVLW B'000010'
MOVWF GPIO
MOVLW .2
CALL DELAY_MS
MOVLW B'000011'
MOVWF GPIO
MOVLW .2
CALL DELAY_MS
MOVLW B'000001'
MOVWF GPIO
MOVLW .2
CALL DELAY_MS
MOVLW B'010001'
MOVWF GPIO
MOVLW .2
CALL DELAY_MS
MOVLW B'010000'
MOVWF GPIO
MOVLW .2
CALL DELAY_MS
GOTO half_step_drive
INVERTE:
MOVLW B'000001'
MOVWF GPIO
CALL delay
MOVLW B'000010'
MOVWF GPIO
CALL delay
MOVLW B'000100'
MOVWF GPIO
CALL delay
MOVLW B'010000'
MOVWF GPIO
CALL delay
GOTO MAIN
INVERTE2:
MOVLW B'000100'
MOVWF GPIO
CALL delay
MOVLW B'000010'
MOVWF GPIO
CALL delay
MOVLW B'000001'
MOVWF GPIO
CALL delay
MOVLW B'010000'
MOVWF GPIO
CALL delay
GOTO MAIN
delay:
movlw .50
movwf DELAY1
loop1:
movlw .100
movwf DELAY2
loop2:
movlw .100 ; 1s
movwf DELAY3
loop3:
decfsz DELAY3,1
goto loop3
decfsz DELAY2,1
goto loop2
decfsz TMR0,1
goto loop1
return
DELAY_MS
MOVWF TEMPO1 ; CARREGA TEMPO1 (UNIDADES DE MS)
MOVLW .250
MOVWF TEMPO0 ; CARREGA TEMPO0 (P/ CONTAR 1MS)
CLRWDT ; LIMPA WDT (PERDE TEMPO)
DECFSZ TEMPO0,F ; FIM DE TEMPO0 ?
GOTO $-2 ; NÃO - VOLTA 2 INSTRUÇÕES
; SIM - PASSOU-SE 1MS
DECFSZ TEMPO1,F ; FIM DE TEMPO1 ?
GOTO $-6 ; NÃO - VOLTA 6 INSTRUÇÕES
; SIM
RETURN ; RETORNA
END

Enviado:
04 Nov 2006 15:36
por zielpunkt
Se eu entendi, vc esta querendo criar um loop e pra isso vc precisa de um contador. Independente disso, a sua rotina está furada porque tem uns GOTOs que vão mante-la travada num mesmo ponto. Outras vezes voce chama por um CALL e retorna com GOTO, em vários pontos. Tem outros trechos que nunca vão ser chamados. Observa a estrutura abaixo e tenta reescrever o seu programa baseado nela:
;...........................................
MAIN
.......; o seu loop "FOR"
movlw n_de_loops ; W com o numero de loops que quer
movwf contador ; e carrega o contador de loops
loop
. call HALF_STEP_DRIVE ; chama a rotina (que volta por um RETURN)
. decfsz contador,f ; decrementa contador, contador = zero?
. goto loop ; não, continua no loop...
;......contador=zero, sai do loop
...
codigo_main
...
. call BLA_BLA ; (exemplo!)
...
goto MAIN
;...........................................
HALF_STEP_DRIVE
...
codigo_half_step_drive
...
. call OUTRA_COISA ; (exemplo!)
...
RETURN
;...........................................
OUTRA_COISA
...
codigo_outra_coisa
...
RETURN
;...........................................
BLA_BLA
...
codigo_bla_bla
...
RETURN
;...........................................
end

Enviado:
06 Nov 2006 18:36
por alex_david_lima
Obrigador pela ajuda, valeu funcionou aki perfeito