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.-
Merci de ta réponse, oui j'ai vérifier le buffer en debut, car j'ai uen routine memset ou j'y est affecter "@" à mon buffer dans totalité et quand le buffer s'affciher il y avait ma chaine puis les "@"comme
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 ? -
-
Je t'avais repondu un pavé mais une erreur de parsing à delete mon message surment donc je suis allé à l'éssentiel.
En faite je n'utilisé pas les Arrow mais avec les backspace :
Etat 0
0x000100bc <bogus+ 0>: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 ... ... 0x000101b4 <bogus+ 0>: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
foo0x000100bc <bogus+ 0>: 0x00 0x66 0x6f 0x6f 0x5c 0x5c 0x5c 0x5c 0x000100c4 <bogus+ 8>: 0x5c 0x5c 0x5c 0x5c 0x5c 0x5c 0x5c 0x5c 0x000100cc <bogus+ 16>: 0x5c 0x5c 0x5c 0x5c 0x5c 0x5c 0x5c 0x5c .... ... 0x000101b4 <bogus+ 16>: 0x5c 0x5c 0x5c 0x5c 0x5c 0x5c 0x5c 0x5c
Déjà mon premier byte reste à zero ^^.
après foo + ( backspace )*2 + ar
0x000100bc <bogus+ 0>: 0x00 0x66 0x6f 0x6f 0x08 0x08 0x61 0x72 0x000100c4 <bogus+ 8>: 0x5c 0x5c 0x5c 0x5c 0x5c 0x5c 0x5c 0x5c .... ... 0x000101b4 <bogus+ 16>: 0x5c 0x5c 0x5c 0x5c 0x5c 0x5c 0x5c 0x5c
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.
0x000100bc <bogus+ 0>: 0x00 0x66 0x6f 0x6f 0x00 0x00 0x08 0x08 0x000100c4 <bogus+ 8>: 0x61 0x72 0x5c 0x5c 0x5c 0x5c 0x5c 0x5c 0x000100cc <bogus+ 16>: 0x5c 0x5c 0x5c 0x5c 0x5c 0x5c 0x5c 0x5c .... ... 0x000101b4 <bogus+ 16>: 0x5c 0x5c 0x5c 0x5c 0x5c 0x5c 0x5c 0x5c
donc ducoup j'ai interdit l'inscriprion de zero dans le buffer.
cmp al, 0 je .loopread
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. -
-
-