Effacer un Fichiére en Assembly pour Fx-9860GII
Posté le 21/12/2025 15:15
J'ai un fichiér "HEX.g1a" dans Memoire Storage(\\fls0\HEX.g1a) mais quand j'essayer de le effacer ca ne marche pas. J'ai essayer beacoup est regarder/compare dans l'emulateur les valeurs de le Registers est la Mémoire est ca devrait vraiment marcher, mais ca ne marche pas. Voici mon code:
.global _start
_start:
MOV.L ramaddr,R4
MOV.L sa,R6
MOV.L R6,@R4
ADD #4,R4
MOV.L sb,R6
MOV.L R6,@R4
ADD #4,R4
MOV.L sc,R6
MOV.L R6,@R4
ADD #4,R4
MOV.L sd,R6
MOV.L R6,@R4
ADD #4,R4
MOV.L se,R6
MOV.L R6,@R4
ADD #4,R4
MOV.L sf,R6
MOV.L R6,@R4
ADD #4,R4
MOV.L sg,R6
MOV.L R6,@R4
ADD #4,R4
MOV.L sh,R6
MOV.L R6,@R4
MOV.L ramaddr,R4
XOR R5,R5
MOV.L otheramadr,R6
NOT R5,R5
MOV.L R5,@R6
NOT R5,R5
MOV #20,R7
MOV.L deletefile,R0
MOV.L syscall,R2
JSR @R2
NOP
!Display result as crash
NOT R2,R2
JSR @R2
NOP
!MOV R4,R11
!XOR R5,R5
!XOR R6,R6
!MOV.L getsize,R0
!MOV.L syscall,R2
!JSR @R2
!NOP
!MOV.L closefile,R0
!MOV.L syscall,R2
!JSR @R2
!NOP
.align 2
syscall:.long 0x80010070
deletefile:.long 0x00000439
openfile:.long 0x0000042C
closefile:.long 0x0000042D
getsize:.long 0x0000042F
ramaddr:.long 0xAC040000
otheramadr:.long 0xAC050000
sa:.long 0x005C005C
sb:.long 0x0066006C
sc:.long 0x00730030
sd:.long 0x005C0048
se:.long 0x00450058
sf:.long 0x002E0067
sg:.long 0x00310061
sh:.long 0x00000000
Je m'excuse si je pose trop de questions..
Citer : Posté le 21/12/2025 17:54 | #
J'avoue que je sais pas trop comment tu arrives à écrire du code comme ça... ? T'as une longue série de .long au lieu de "juste"
Tu copies le chemin en RAM mais tu va chercher de la RAM là où elle n'existe absolument pas, donc évidemment ça n'écrit rien. Alors que t'as la pile sous la main...
J'ai aucune idée de ce que otheramadr est (la première n'est déjà pas une adresse dans la RAM) ?
Enfin, c'est pas x86, xor r5, r5 c'est juste mov #0, r5 (mais je comprends pas la section non plus)
Sans contexte on voit pas ce que tu veux faire ni même juste pourquoi tu le codes en assembleur ?
Citer : Posté le 22/12/2025 12:37 | #
J'ai pris une notre adresse que marche(0x88000000) et ca marche :O, j'aurais vraiment abondoné lá... Je sais que mon code n'est pas bien est j'ai pas encore utiliser le stack parce que j'aurais du apprendre comment l'utilisier au lieu de faire mon methode mal qui est plus simple(Que je connais déja), mais oui je vais le faire avec le stack. Est je fait XOR Rn,Rm au lieu de MOV #0,Rn parce que je croix que c'est plus vite? Merci telment!
Citer : Posté le 22/12/2025 13:01 | #
De façon générale écrire à des adresses aléatoires en RAM est très très risqué, tu vas écraser des données de l'OS et le faire crasher plus tard. Il faut vraiment écrire que là où « t'as le droit », donc en gros sur la pile ou à 0x08100000.
Eh non c'est que les processeurs x86 où "xor reg, reg" a un encodage plus compact que "mov reg, 0" et est donc plus rentable. SuperH est une architecture différente (et propre) et n'a pas cette bizarrerie. En l'occurrence "mov #0, rn" ira plus vite parce que ça évite de mobiliser l'ALU.
Citer : Posté le 22/12/2025 16:58 | #
Merci pour l'adresse! C'est grand comment? Tous P1?
Citer : Posté le 22/12/2025 17:11 | #
Ouh là non, déjà P1 ça fait 512 Mo et y'a pas du tout tout ça, d'autre part l'adresse en question est dans P0.
Pour la taille, vois ici : https://bible.planet-casio.com/lephenixnoir/en/sh7305/calc/userspace
Sur ton modèle c'est probablement 32 ko moins la taille de la pile.
Citer : Posté le 22/12/2025 19:59 | #
Est-ce qu'il y aussi un region oú on peux écrire ET executer d'assembly/hex?
(0x8800 0000?)
Citer : Posté le 22/12/2025 20:02 | #
Pas facilement non. Il faut aller dans P1 ou P2, purger les deux caches, etc. Un exemple simple dans gint (fonction de sommeil que tu peux interrompre) : https://git.planet-casio.com/Lephenixnoir/gint/src/branch/master/src/cpu/ics.s
Dans ce cas le code est mis dans un buffer fourni en paramètre. Le plus facile est de le prendre sur la pile.