Asm icompréhension [Résolu]

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

 ; 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..

12 réponses

Marsh

NOVEMBER 9, 2013 AT 9:15 PM

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.

Reply
réponses:
  • auteur

  • auteur

    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

    [email protected]@@@@@@@@@....x251 \0

    et le buffer et bien

    [email protected]@@@@@@@x251 \0 et non [email protected]@@@@@@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 ?

  • le père.

    Peux-tu montrer une copie d'écran de l'affichage en hexadécimal du contenu de la mémoire de ton buffer?

  • auteur

    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 


    foo
     0x000100bc <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.

  • le père.

    Donc tout est normal et se passe comme je te l'avais dit hier.
    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 ?

  • auteur

    Non c'est bon, BC c'est le 0 du buffer précedent de PS

      section .data  	ps: 		db "[email protected]:/$ ",0 	buffer: 		resb 	0xFF 	crlf: 		db 13,10,0 


    donc

    bin.o

    . TEXT
    .DATA
    kernelMgrBuff . ps ce termine en 0xBC . buffer . crlf

    .END

  • le père.

    C'est très dangereux de ne pas initialiser SI après l'appel à print. C'est vraiment fait exprès, ou c'est un gros coup de bol que buffer soit juste après ps, et que print laisse SI juste au bon endroit ?

  • auteur

    oui et non tu as raison ce n'est pas un hasard qu'il soivent placer, la c'est à cause d'une erreur précédente.

    regarde mon code non justement, car au debut de la routine endread je suis obliger de push si sinon j'ai un retour aiu prompte comme ceci

    ....$foofoo....$testtest........$

     ; Print Function ; bh = color [BITS 16] [ORG 0x0]  global __main__  %define DS_SEG 0x1000 ; DS ES SEG %define SS_SEG 0x8000 ;  %define SP_SEG 0x0f00 ;   section .data  kernelLoaded:   db "[ OK ] Kernel is loaded !",13,10,0  ps:   db "[email protected]:/$ ",0  buffer:   resb  0xFF  crlf:   db 13,10,0 section .bss section .text   jmp __main__ ; param si = string offset ; return cx strlen:  xor cx, cx  .loopstr:  lodsb  cmp al,0  je .endstr  inc cx  jmp .loopstr .endstr:  ret  print:  push ax  push bx  mov ah, 0x0E  xor  bh,bh  mov  dx, 0x0002 .loop:  lodsb  cmp al,0  je pend  int 0x10   jmp .loop pend:  pop ax  pop bx  ret  ; memset ; param al = ASCII ;  cx = buffer size ; si = buffer Addr memset: .loopmem:  mov [si],al  dec cx  inc si  cmp cx, 0   je .endmemset  jmp .loopmem .endmemset:  ret  __main__:    ; INIT DATA SEG  mov ax, DS_SEG  mov ds, ax  mov es, ax  xor si, si   xor di, di    ; INIT STACK  mov ax, SS_SEG  mov ss, ax  mov sp, SP_SEG    mov bl, 0x02  mov si, kernelLoaded  call print  ; prompt  prompt:  ; reset buffer prompt  mov ax, 0x00  mov si, buffer  mov cx, 0xfe  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  cmp al, 0  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  


    et la MBR

      ; compile with nasm ; 2017 BASIC MBR 16/32 Bits   [BITS 16] [ORG 0x0]  ; Floppy sector %define SECT_SZ 512  %define BOOTSEG 0x07c0 ; BIOS ROUTINE ADDR %define SS_BASE 0x8000 ; STACK BASE ADDR %define SS_SIZE 0x0f00 ; STACK SIZE  %define SYS_SEG 0x1000 ; system loaded to sector 1    global _start  section .data section .bss section .text   ; main  jmp _start  db "BOOT",0 ; MAGIC_BOOT_SECTOR ;)  ; reset  ; Screen reset:  mov ax, 0x0003  mov byte[row],0  int 0x10  ret _start:  ; INIT SEGMENTATION  ; SEG DS    : Program data MBR 0x07c0  ; SEG ES    : Progam multi-segment  ; SEG SI DI : Ptr src, dst   mov ax, BOOTSEG  mov ds, ax  mov es, ax  xor di,di  xor si,si   ; STACK SEG INIT  ; SIZE : 0x1000 bytes   mov ax, SS_BASE  mov ss, ax  mov sp, 0xf000   ; reset screen  call reset   ; bootMgr  mov ax, 0x1301  mov cx, 0x17  mov bx, 0x0002  mov bp, bootMgr  mov dh, byte[row]  inc byte[row]  int 0x10    ; load kernel  call kernelLoad   end:  jmp end  badLoad:  mov ax, 0x1301  mov cx, 0x1c  mov bx, 0x0002  mov bp, bootErrorMgr  mov dh, byte[row]  inc byte[row]  int 0x10  jmp end  ret  kernelLoad:  xor ax, ax  int 0x13   mov al, 0x05  push ax  push es  ; init segement  ; 0x0001:0000  mov ax, SYS_SEG  mov es, ax  mov bx, 0x00       mov ax, 0x0201     mov cx, 0x0002     xor dx, dx      int 0x13  pop es  jc badLoad   ; saut vers le kernel  call reset      jmp dword SYS_SEG:0  ret  ; VARIABLE HERE ; si ont dispose les vars  dans le  ; segment : .data les deux derniers ; octects ne seront pas 0x55AA mais ; la section .data donc Boot Failed. bootMgr:   db "Loading basic kernel...",0  bootErrorMgr:  db "[ BAD] Bad sector ! Halted !",0  row:  db 0 drive:   db 0 buffer:   resb 0xff   ; Bourrage   ; 510 bytes + 2 bytes e_magic  times 510-($-$$) db 0  dw 0xAA55 


    it's Bad ?

  • auteur

    Je vois que tu t'y connais pas mal pour le noyau tu orienterai vers quel language le c ou cpp, je voulais le faire en cpp, il y a t-il des inconvéniant à le faire dans ce language ?

  • le père.

    Tu me surestimes beaucoup… Désolé, mais je ne saurai pas t'aider là-dessus.

  • auteur

    Pas de problème, merci de m'avoir éclairer.

  • le père.

    De rien :-)

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed