Asm icompréhension
Résolu
r00t3r
-
Utilisateur anonyme -
Utilisateur anonyme -
Bonjour,
Bonjour j'aivais une petite question, j'ai réalisé cette routine ci-desous qui récupére une input du clavier puis la stocker dans un buffer qui pointe sur DS:SI , je suis en 16 bits en mode réel, je m'amuse juste rien de professionnel
Dans .loopread je récupére le char ASCII de l'interrupt 0x16 puis je le place sont contenu dans mon buffer jusque la rien alarmant si je tape :
foo
le buffer affiché sera foo
par contre si je tape :
foo et que je revien ensuite sur le premier "o" avec mon curseur pour rectifier par "far" mon buffer sera égale à :
far
mais ce que je comprend pas c'est que dans ma routine le registre SI est incrémenté mêe si le curseur de l'ecran soit a x ou x-5 le buffer avance pour moi je pensais avoir un bufer comme ceci :
fooar
je n'arrive pas à compendre, j'ai peut être loupé une chose ? je ne suis pas bloqué mais j'aimerais comprendre, je le l'ais pas debugger car le debugger console je trouve pas top, j'aurais aimer avoir la version gui de bochs mais je n'arrive pas à la lancer en mode graphique..
Bonjour j'aivais une petite question, j'ai réalisé cette routine ci-desous qui récupére une input du clavier puis la stocker dans un buffer qui pointe sur DS:SI , je suis en 16 bits en mode réel, je m'amuse juste rien de professionnel
; prompt prompt: ; reset buffer prompt mov ax, 0x00 mov si, buffer mov cx, 0xff call memset ; PS mov si, ps mov bl, 0x02 call print .loopread: xor ax, ax int 0x16 cmp al, 0x0D je .endread cmp cx, 0xff je .loopread mov [si], al inc si mov ah, 0x0E mov bx, 0x0002 int 0x10 inc cx jmp .loopread .endread: push esi mov bl, 0x02 mov si, crlf call print mov bl, 0x02 mov si, buffer call print mov bl, 0x02 mov si, crlf call print loopback: jmp prompt
Dans .loopread je récupére le char ASCII de l'interrupt 0x16 puis je le place sont contenu dans mon buffer jusque la rien alarmant si je tape :
foo
le buffer affiché sera foo
par contre si je tape :
foo et que je revien ensuite sur le premier "o" avec mon curseur pour rectifier par "far" mon buffer sera égale à :
far
mais ce que je comprend pas c'est que dans ma routine le registre SI est incrémenté mêe si le curseur de l'ecran soit a x ou x-5 le buffer avance pour moi je pensais avoir un bufer comme ceci :
fooar
je n'arrive pas à compendre, j'ai peut être loupé une chose ? je ne suis pas bloqué mais j'aimerais comprendre, je le l'ais pas debugger car le debugger console je trouve pas top, j'aurais aimer avoir la version gui de bochs mais je n'arrive pas à la lancer en mode graphique..
1 réponse
Bonjour
Quand tu dis que ton buffer est égal à far au lieu de fooar, l'as-tu vraiment vérifié dans le buffer, ou te fies-tu à l'affichage qui est fait à la fin de ton programme ?
À mon avis, dans ton buffer, il y a foo←←ar (où ← represente la touche qui faite reculer le curseur) et quand tu affiches ça, tu ne vois que far parce que le curseur recule comme quand tu as saisi.
Quand tu dis que ton buffer est égal à far au lieu de fooar, l'as-tu vraiment vérifié dans le buffer, ou te fies-tu à l'affichage qui est fait à la fin de ton programme ?
À mon avis, dans ton buffer, il y a foo←←ar (où ← represente la touche qui faite reculer le curseur) et quand tu affiches ça, tu ne vois que far parce que le curseur recule comme quand tu as saisi.
foo@@@@@@@@@@....x251 \0
et le buffer et bien
far@@@@@@@@x251 \0 et non fooar@@@@@@@x249 \0
c'est pour cela que je ne comprenais pas, mais j'y est penser mais j'ai check le buffer.
Sinon ça fonctionne, mais bon c'est bien la première fois après réflexion pour moi y a une erreur est elle est logique et non... je me dit que c'est peut-être émilateur qui fait ça ?
En faite je n'utilisé pas les Arrow mais avec les backspace :
Etat 0
foo
Déjà mon premier byte reste à zero ^^.
après foo + ( backspace )*2 + ar
En faite lors de l'affichage les 0x08 backspace, puis repositionne les curseur du prompt et continue jusqu'au byte null
de la le : far
maintenant pour les arrows ils inscrivent des zéro dans le buffer.
donc ducoup j'ai interdit l'inscriprion de zero dans le buffer.
Pour le moment je m'en contente, surtout que c'est juste pour apprendre.
img de bochs : https://ibb.co/nBKJOp
je suis un peu honteux car j'ai l'habitude de toujour debugger, comme c'est en console...avec un peu de motivation.
Merci est désoler encore.
Sauf le premier octet à 0 : mais je vois que pour enregistrer les touches frappées, tu initialises SI avec ps et non pas avec buffer. ps ne serait pas égal à buffer+1 ?
donc
bin.o
. TEXT
.DATA
kernelMgrBuff . ps ce termine en 0xBC . buffer . crlf
.END