Logo Hardware.com.br
OfflineUser
OfflineUser General de Pijama Registrado
3.2K Mensagens 228 Curtidas

[Resolvido] Ajuda com instruções Assembly [pf]

#1 Por OfflineUser 22/02/2010 - 16:33
Colegas,

Gostaria de saber como funcionam as seguintes instruções detalhadamente:

-Instrução IF/ELSE/ENDIF

Vejam,

 
;programa....
IF alguma_coisa < 5
GOTO fazer tal coisa
;se eu nao usar esse goto acima? DECF por ex.
ELSE
INCF um_registrador,F
ENDIF
;proxima linha de programa


Gostaria de saber se eu nao usar o goto, por exemplo nao usar goto e usar um DECF, o programa vai para proxima linha do IF (no caso roda o else) ou ele sai e vai para proxima linha do programa? (como se fosse um goto sai_if)

E se eu nao usar o ELSE? qual a proxima linha?


-Instrução WHILE/ENDW

geralmente vejo:

 
WHILE true
;instrucoes
ENDW


O que essa instrução faz, e o que significa esse true? posso colocar oque ali, como posso usar esse tipo de instrução para elaborar meus programas?


Agradeço a todos desde já!
Fergo
Fergo Highlander Registrado
9.3K Mensagens 1.1K Curtidas
#2 Por Fergo
22/02/2010 - 17:24
Isso aí na verdade não é assembly, pois ela não possui esse tipo de estrutura de controle (if/else/endif) e repetições (loop/while/for). É uma linguagem não estruturada. Esse código que você postou talvez seja o que alguns chamam de HLA, ou High Level Assembly.

Quanto ao primeiro código, não faz sentido utilizar GOTO quando se dispõe de estruturas de controle como o IF (você até pode, mas é uma má pratica de programação). Você usaria GOTO se estivesse trabalhando com o assembly convencional, no qual esse comando é chamado Jump (JMP). Eu não me recordo do mnemônico DECF no asm para 8086 e sucessores. Você está programando para PIC ou algo do gênero?

Já no segundo exemplo, aquele trecho de código seria um loop infinito (equivalente a um while(1) em C). Imagino que nessa versão de asm que você está trabalhando, seria possível adicionar uma condicional ali para quebrar a repetição ao atingir determinada condição, como:


WHILE alguma_coisa < 5
;instrucoes
ENDW
Isso faria com que as instruções fossem repetidas enquanto a variável alguma_coisa for menor que 5.

Fergo
Site pessoal www.fergonez.net
Portfolio
www.fbirck.com
Artigos
Informática
OfflineUser
OfflineUser General de Pijama Registrado
3.2K Mensagens 228 Curtidas
#3 Por OfflineUser
22/02/2010 - 17:30
Olá, sim eu estou programando em assembly para uCs mesmo, veja, isso é o que diz a ajuda do meu compilar assembler:

Eu nao entendo muito disso só queria facilitar minha vida, penso q isso ai ia me ajudar mais, veja eu uso instruções do tipo, MOVLW e tals, SUBWF, XORWF, MOVF, BTFSS, e la vai...

IF/ELSE/ENDIF:
if - Begin Conditionally Assembled Code Block 
Syntax
if expr
Description
Begin execution of a conditional assembly block. If expr evaluates to true, the code immediately following the if will assemble. Otherwise, subsequent code is skipped until an else directive or an endif directive is encountered.

An expression that evaluates to zero is considered logically FALSE. An expression that evaluates to any other value is considered logically TRUE. The if and while directives operate on the logical value of an expression. A relational TRUE expression is guaranteed to return a nonzero value, FALSE a value of zero.

if's may be nested up to 16 deep.

Usage
This directive is not an instruction, but used to control how code is assembled, not how it behaves at run-time. Use this directive for conditional assembly or to check for a condition, such as to generate an error message.

See Also
else endif
Simple Example
if version == 100; check current version
movlw 0x0a
movwf io_1
else
movlw 0x01a
movwf io_2
endif
Application Example - if/else/endif
This program demonstrates the utility of if, else and endif assembly directives.

#include p16f877a.inc ;Include standard header file
;for the selected device.
variable config ;variable used to define
;required configuration of
;PORTA & PORTB, not to be confused
;with __config.
config set .1 ;Set config to decimal .1
RST CODE 0x0 ;The code section named RST
;is placed at program memory
;location 0x0. The next two
;instructions are placed in
;code section RST.
pagesel start ;Jumps to the location labelled
goto start ;'start'.
PGM CODE ;This is the begining of the
;code section named PGM. It is
;a relocatable code section
;since no absolute address is
;given along with directive CODE.
start
banksel TRISA
if config==0x0 ;If config==0x0 is true,
clrw ;assemble the mnemonics up to
movwf TRISA ;the directive 'else'. Set up PORTA
movlw 0xff ;as output.
movwf TRISB
else
clrw ;If config==0x0 is false,
movwf TRISB ;assemble the mnemonics up to
movlw 0xff ;the directive 'endif'. Set up PORTB
movwf TRISA ;as output.
endif
goto $ ;Go to current line (loop here)
end


WHILE:
while - Perform Loop While Condition is True 
Syntax
while expr
:
endw
Description
The lines between the while and the endw are assembled as long as expr evaluates to TRUE. An expression that evaluates to zero is considered logically FALSE. An expression that evaluates to any other value is considered logically TRUE. A relational TRUE expression is guaranteed to return a non-zero value; FALSE a value of zero.

A while loop can contain at most 100 lines and be repeated a maximum of 256 times. while loops can be nested up to 8 deep.

Usage
This directive is not an instruction, but used to control how code is assembled, not how it behaves at run-time. Use this directive for conditional assembly.

See Also
endw if
Simple Example
while is not executed at run-time, but produces assembly code based on a condition. View the list file (*.lst) or disassembly window to see the results of this example.

test_mac macro count
variable i
i = 0
while i < count
movlw i
i += 1
endw
endm
start
test_mac 5
end
Application Example - while/endw
This example shows the usefulness of directive while to perform a loop while a certain condition is true. This directive is used with the endw directive.

#include p16f877a.inc ;Include standard header file
;for the selected device.
variable i ;Define the symbol 'i' as a
;variable.
mydata udata 0x20 ;Allocate RAM for labels
reg_hi res 1 ;reg_hi and reg_lo.
reg_lo res 1
RST CODE 0x0 ;The code section named RST
;is placed at program memory
;location 0x0. The next two
;instructions are placed in
;code section RST.
pagesel start ;Jumps to the location labelled
goto start ;'start'.
shift_right macro by_n ;Beginning of a macro, which
;shifts register data n times.
;Code length generated after
;assembly, varies depending upon
;the value of parameter 'by_n'.
i=0 ;Initialize variable i.
while i< by_n ;Following 3 lines of assembly
;code are repeated as long as
;i< by_n.
Up to 100 lines of codes are allowed inside a while loop.

bcf STATUS,C ;Clear carry bit.
rrf reg_hi,F ;reg_hi and reg_lo contains
rrf reg_lo,F ;16-bit data which is rotated
;right through carry.
i+=1 ;Increment loop counter i.
i cannot increment to more than 255 decimal.

endw ;End while loop. The loop will
;break here after i=by_n.
endm ;End of 'shift_right' macro.
PGM CODE ;This is the begining of the
;code section named PGM. It is
;a relocatable code section
;since no absolute address is
;given along with directive CODE.
start
movlw 0x88 ;Initialize reg_hi and
movwf reg_hi ;reg_lo for observation.
movlw 0x44
movwf reg_lo
shift_right 3 ;Shift right 3 times the 16-bit
;data in reg_hi and reg_lo. This
;is an example. A value 8 will
;shift data 8 times.
goto $ ;Go to current line (loop here)
end
Fergo
Fergo Highlander Registrado
9.3K Mensagens 1.1K Curtidas
#4 Por Fergo
22/02/2010 - 17:39
Você está com dúvidas nas instruções, é isso? Não conheço esse tipo de assembly, mas possivelmente no site do desenvolvedor do PIC deve haver uma referência de instruções ou algo do tipo.

Os códigos ali exemplificam a utilização do If e While, misturando um pouco de linguagem estruturada com o assembly tradicional. Veja que ele não usou GoTo em nenhum momento, uma vez que a linguagem fornece o If como alternativa. Se a condição do If for verdadeira, ele entra no bloco do If e executa seus comandos. Caso contrário ele simplesmente pula para o final (EndIf) ou para o bloco do Else, caso exista.
Para o caso do While, é aquilo que eu falei. O conteúdo do bloco do While (tudo o que está entra o While e o EndW) vai ser repetido até que a condição da repetição seja satisfeita.

Fergo
Site pessoal www.fergonez.net
Portfolio
www.fbirck.com
Artigos
Informática
OfflineUser
OfflineUser General de Pijama Registrado
3.2K Mensagens 228 Curtidas
#5 Por OfflineUser
22/02/2010 - 17:53
ah entendo! vou tambem dar umas pesquisas ver se descubro algo a mais.

Entao se eu colocar por ex.

WHILE alguma_coisa == 100

ele sai desse loop quando alguma_coisa for igual a 100, é isso?

No caso da explicação do programa (ajuda) ele diz q so pode fazer o loop 255vezes, no maximo 8 pulos dentro dela e no maximo 100 linhas.

A while loop can contain at most 100 lines and be repeated a maximum of 256 times. while loops can be nested up to 8 deep.


correto?

EDIT!!
-----------------------------------------------

Problemas resolvidos, consegui um codigo que resolve esse problema e mantem em assembly de baixo nivel ainda (nos outros programas que tinha guardados aqui em uma pasta), perfeito!
Obrigadao pela ajuda ai!!!

Abracos! to feliz!
Fergo
Fergo Highlander Registrado
9.3K Mensagens 1.1K Curtidas
#6 Por Fergo
22/02/2010 - 18:56
'[Daniel
;4831397']
Entao se eu colocar por ex.

WHILE alguma_coisa == 100

ele sai desse loop quando alguma_coisa for igual a 100, é isso?


Não, é o contrário. Ele vai sair do loop quando alguma coisa for diferente de 100. Talvez se você "ler" a linha traduzida para o portugues, fique mais fácil de visualizar. Traduzindo o seu código acima:


Enquanto alguma_coisa for igual a 100
;execute o que está aqui dentro
Repita
A condição que você coloca é aquela para ele continuar no loop, não para sair dele.

'[Daniel
;4831397']
No caso da explicação do programa (ajuda) ele diz q so pode fazer o loop 255vezes, no maximo 8 pulos dentro dela e no maximo 100 linhas.

correto?


As duas primeiras, sim. A última, que fala "while loops can be nested up to 8 deep", indica que você pode encapsular (colocar um dentro do outro) o loop em 8 níveis. Por exemplo:


WHILE cond
WHILE cond2
WHILE cond3
;voce pode colocar ate 8 loops dentro de um loop
ENDW
ENDW
ENDW

Essas limitações estão relacionadas com a capacidade de processamento/armazenamento do PIC. Por exemplo, o fato de poder realizar o loop no máximo 256 vezes indica possivelmente que o incrementador utilizado para a contagem é de apenas 1 byte (0 a 255).

Fergo
Site pessoal www.fergonez.net
Portfolio
www.fbirck.com
Artigos
Informática
OfflineUser
OfflineUser General de Pijama Registrado
3.2K Mensagens 228 Curtidas
#7 Por OfflineUser
23/02/2010 - 07:53
Fergo disse:
Não, é o contrário. Ele vai sair do loop quando alguma coisa for diferente de 100. Talvez se você "ler" a linha traduzida para o portugues, fique mais fácil de visualizar. Traduzindo o seu código acima:


Enquanto alguma_coisa for igual a 100
;execute o que está aqui dentro
Repita
A condição que você coloca é aquela para ele continuar no loop, não para sair dele.


Ah bom, nos proximos programas que escrever vou tentar usar estas instruções. Quero testar na pratica.



Fergo disse:
As duas primeiras, sim. A última, que fala "while loops can be nested up to 8 deep", indica que você pode encapsular (colocar um dentro do outro) o loop em 8 níveis. Por exemplo:


WHILE cond
WHILE cond2
WHILE cond3
;voce pode colocar ate 8 loops dentro de um loop
ENDW
ENDW
ENDW

Essas limitações estão relacionadas com a capacidade de processamento/armazenamento do PIC. Por exemplo, o fato de poder realizar o loop no máximo 256 vezes indica possivelmente que o incrementador utilizado para a contagem é de apenas 1 byte (0 a 255).

Fergo


Ah bom!! Tenho muito que aprender ainda...mas eu chego la sim.

A respeito do que eu precisava fazer, resolvi com isso:

 MOVF		reg1,W 
XORWF reg2,W
BTFSC STATUS,Z ;reg1=reg2?
GOTO vai_a_algum_lugar ;sim
MOVF reg2,W ;nao
SUBWF reg1,W ;reg1-reg2?
BTFSS STATUS,C
GOTO tal_linha
GOTO outra_linha


Entao estou fazendo as operaçoes de IF/ELSE sem usar aquele comandos só alguns de assembly mesmo, e funcionou!

Obrigadao ai Fergo! Abraço.
© 1999-2024 Hardware.com.br. Todos os direitos reservados.
Imagem do Modal