Page 1 sur 4

Aide pour débutant en assembleur svp

Message non luPosté: 06 Sep 2019, 11:50
de emilechombier
Bonjour,
Je débute en assembleur sur Ti83PCE-EP
J'apprends avec le tuto de themachine2 ici, et ceux en anglais sur le Z80
J'ai fait un essai de boucle vide avec PB que j'ai nettoyé pôur le faire fonctionner avec SPASM:

Code: Tout sélectionner
   #include "ti83pce.inc"
   .assume ADL=1
   .db tExtTok,tAsm84CeCmp
   .org userMem
   
_main:
    ld  hl,-3
    call    __frameset
    ld  bc,1
    ld  (ix+-3),bc
l_1:
    ld  bc,(ix+-3)
    inc bc
    ld  (ix+-3), bc
    ld  hl,bc
    or  a,a
    ld  bc,101
    sbc hl,bc
    jr  c,l_1
    ld  sp,ix
    pop ix
    ret


Je ne comprends pas pourquoi SPASM me renvoie :

15: error SE106: Could not find label or macro 'bc'

...alors que ça marche bien sur PB compilé avec ZDS

Merci d'avance

Re: Aide pour débutant en assembleur svp

Message non luPosté: 06 Sep 2019, 12:54
de Limonadd
je pense que c'est à cause du ld hl,bc si tu veux mettre la valeur de bc dans hl tu peux faire:
ld l,c
ld h,b

et si tu as besoin des registres supérieurs de hl et bc (les 8 bits en plus) tu peux utiliser un push bc pop hl à la place

Re: Aide pour débutant en assembleur svp

Message non luPosté: 06 Sep 2019, 12:59
de Limonadd
mais fais attention si tu fais:
ld l,c
ld h,b

le registre supérieur de hl reste inchangé, donc si tu avais autre chose qu'un 0 dedans, tu auras donc une mauvaise valeur dans hl, c'est pourquoi tu peux mettre un ld hl,0 avant, comme ça ça met 0 dans l, dans h, et dans hlu

Re: Aide pour débutant en assembleur svp

Message non luPosté: 06 Sep 2019, 13:01
de Limonadd
quand je dis registre supérieur de hl, je veux dire hlu, quand tu es en mode ADL=1, tes registres font 24 bits. hl fait 24 bits, avec l et h, et encore hlu, mais ce dernier n'est pas accessible directement, c'est pareil pour tous les autres registres

Re: Aide pour débutant en assembleur svp

Message non luPosté: 06 Sep 2019, 14:08
de emilechombier
merci pour ces infos, mais ces lignes ont été générées automatiquement à partir du compilateur C qui est sur PB (du moins à partir de "main:", car j'ai remplacé l'en-tête vu que je change de compilateur)
https://tiplanet.org/pb/?id=229901_1567367967_86bf32715a
donc pourquoi ça marche avec PB et pas avec SPASM? mmm le mystère reste entier... B-)

Re: Aide pour débutant en assembleur svp

Message non luPosté: 07 Sep 2019, 03:09
de Adriweb
Es-tu es bien sur d'avoir utilisé spasm-ng en mode ez80 ?

Par ailleurs, la toolchain utilise depuis quelques temps maintenant "fasmg" au lieu de spasm-ng (ni le tutorial ni le PB actuellement, ne sont a jour sur ce point la). Cést un assembleur bien plus puissant, mais plus complexe aussi ^^
Tu peux trouver des infos sur https://github.com/CE-Programming/toolchain/wiki et evidemment dans le repo de la toolchain en general : https://github.com/CE-Programming/toolchain

Quand j'aurais suffisament de temps libre pour re-bosser sur le PB, je mettrai le backend ez80_native a jour, et ajouterai d'autres modules...

Re: Aide pour débutant en assembleur svp

Message non luPosté: 07 Sep 2019, 16:32
de Epharius
Ah oui, ld hl,bc n'a jamais existé, on ne peut pas mettre un registre non 8bits (usuel i.e. hl, de, bc) dans un autre registre non 8bits. Donc ld hl,de ou ld bc,de ça n'existe pas non-plus etc.
Comme l'a dit Limonadd, faire "ld h,d / ld l,e" n'est pas équivalent à ce que tu veux faire. Donc si tu veux vraiment mettre DE dans HL, tu peux néanmoins écrire :
Code: Tout sélectionner
push de
pop hl

Mais c'est assez lent donc souvent ce qu'on fait c'est qu'on n'essaie pas de mettre un registre 24b dans un autre :P

Re: Aide pour débutant en assembleur svp

Message non luPosté: 07 Sep 2019, 17:55
de TheMachine02
Effectivement, le compilateur ez80 de zilog émet trois pseudo-instruction qui n'existe pas dans le set du processeur :
Code: Tout sélectionner
uext hl
sext hl
ld reg24, reg24 (exemple : ld hl, bc)

Ce sont des instructions qui sont déconstruites par la suite en instructions du processeur. Ça donne en gros ça :
Pour uext hl :
Code: Tout sélectionner
or a, a
sbc hl, hl

Pour sext hl :
Code: Tout sélectionner
rla
sbc hl, hl

Pour les load 24 bits, c'est implémenté avec des push/pop.

Donc effectivement, c'est pas compris par spasm car c'est des choses qui n'existe pas pour lui, tout simplement, en tout cas de base. Dans les précédentes versions de la toolchain, il me semble que des macro ont été rajouté pour comprendre ces trucs pas beau :p

Re: Aide pour débutant en assembleur svp

Message non luPosté: 07 Sep 2019, 21:12
de emilechombier
OK donc essayer d'apprendre l'ASM en faisant en regardant le code que compile PB pour faire des "rapprochements", c'est une mauvaise idée...
:'( :(
Heureusement j'ai d'autres codes de jeux en ASM sous la main (dont celui de Limonad merci à lui) je les utilise pour apprendre en les "déconstruisant" par petits bouts.

Re: Aide pour débutant en assembleur svp

Message non luPosté: 07 Sep 2019, 21:25
de emilechombier
au fait, pendant que je vous ai au bout du fil, à quoi correspond :

Code: Tout sélectionner
_main:
    ld  hl,-3
    call    __frameset
    ld  bc,1
    ld  (ix+-3),bc


et notamment le -3 et le (ix+-3) ? ce truc me semble bizarre
(désolé pour mes questions naïves)