{{{ #!comment Page d'aide assembleur }}} [[PageOutline]] {{{ #!html
Faire N fois (8 bits) sequence_corps FIN | |||
Si N est une valeur immédiate. {{{ movlw N movwf REG corps sequence_corps decfsz REG goto corps }}} | Si N est dans un registre. {{{ movf REG_N, W movwf REG corps sequence_corps decfsz REG goto corps }}} * Faire N fois (16 bits) sequence_corps FIN Si N est une valeur immédiate:: {{{ movlw (HIGH N) + 1 movwf REG+1 movlw LOW N movwf REG movf REG, F btfsc STATUS, Z goto testh corps sequence_corps decfsz REG goto corps testh decfsz REG+1 goto corps fin }}} Si N est dans une paire de registres successifs:: {{{ incf REG_N+1, W movwf REG+1 movf REG_N, W movwf REG btfsc STATUS, Z goto testh corps sequence_corps decfsz REG goto corps testh decfsz REG+1 goto corps fin }}} == ` ` Switch case == #switchcase Le switch case est un test à choix multiples. Il existe dans tous les langages évolués et permet entre autre de décrire les automates d'états finis particulièrement important dans la programmation en assembleur. La forme générale du switch case est:: {{{ switch reg case CST1 : sequence_cst1; break; case CST2 : sequence_cst2; break; case CST3 : sequence_cst3; break; default : sequence_default end }}} Les valeurs CST peuvent être quelconque. Dans ce cas, il n'y a d'autres choix que de faire les tests les uns après les autres en séquence. Dans le code qui suit, on suppose que les constantes sont bien des valeurs immédiates mais en fait il peut s'agir de registres. On peut même faire des tests différents. C'est très général mais évidemment ce n'est pas très effice et tous les tests ne sont pas équivalent vis à vis du temps de traitement. Le premier est favorisé par rapport au dernier. switch general:: Si les valeurs constantes sont quelconques: {{{ ; BEQ reg, CST1, goto, label_cst1 movlw CST1 xorwf reg, W btfsc STATUS, Z goto label_cst1 ; BEQ reg, CST2, goto, label_cst2 movlw CST2 xorwf reg, W btfsc STATUS, Z goto label_cst2 ; BEQ reg, CST3, goto, label_cst3 movlw CST3 xorwf reg, W btfsc STATUS, Z goto label_cst3 ; BEQ reg, CST4, goto, label_cst4 movf CST4 xorwf reg, W btfsc STATUS, Z goto label_cst4 }}} {{{ ; puis a la suite des tests ; les sequences a executer sequence_default label_cst1 sequence_cst1 goto fin label_cst2 sequence_cst2 goto fin label_cst3 sequence_cst3 goto fin label_cst4 sequence_cst4 goto fin fin }}} mais pour être efficace, il est souhaitable de se contraindre dans le choix des valeurs. == ` ` Tantque condition faire == #tantque = Arithmétiques = #arith == ` ` Entière 8 bits == #int9 * Addition * Soustraction * Multiplication * Division == ` ` Entière 16 bits == #int16 == ` ` Virgule fixe 16 bits == #vfixe16 == ` ` Flottante 16 bits == #float16 = Expressions = #expr == ` ` Boolèennes == #exp_bool == ` ` Arithmétiques == #exp_arith = Structures de données = #struc_data == ` ` Tableaux de données == #tables * Dans les registres * Dans le programme == ` ` Liste chainée == #listes == ` ` Pile == #piles = Macroinstructions = #macros = Automates = #automates = Routines diverses (snippets) = #snippets == ` ` Mathématiques == #snippets_math * Parité * Moyenne glissante * PGCD |