Menu

Asm icompréhension [Résolu]

r00t3r - 10 oct. 2018 à 18:55 - Dernière réponse : le père. 6194 Messages postés mardi 15 mai 2012Date d'inscription 11 octobre 2018 Dernière intervention
- 11 oct. 2018 à 21:32
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..

Afficher la suite 

Votre réponse

12 réponses

le père. 6194 Messages postés mardi 15 mai 2012Date d'inscription 11 octobre 2018 Dernière intervention - Modifié par le père. le 10/10/2018 à 20:45
0
Merci
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.
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 "wos@free:/$ ",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 ?
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. 6194 Messages postés mardi 15 mai 2012Date d'inscription 11 octobre 2018 Dernière intervention - 11 oct. 2018 à 20:26
Tu me surestimes beaucoup… Désolé, mais je ne saurai pas t'aider là-dessus.
Pas de problème, merci de m'avoir éclairer.
le père. 6194 Messages postés mardi 15 mai 2012Date d'inscription 11 octobre 2018 Dernière intervention > r00t3r - 11 oct. 2018 à 21:32
De rien :-)
Commenter la réponse de le père.