IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

x86 16-bits Assembleur Discussion :

ASSUME et segment


Sujet :

x86 16-bits Assembleur

  1. #1
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    272
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 272
    Points : 166
    Points
    166
    Par défaut ASSUME et segment
    Bonjour,

    J'ai fait un prog en assembleur ( .com ) qui copie un boot secteur sur une disquette ainsi que le contenu d'un programme EXE dos dans les secteur 1 et 2 de la disquette ( en prenant soin de passe l'entete DOS du fichier PROGRAM2.EXE )

    Voici le source:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    Code Segment
    	Assume Cs : Code		; CS pointe vers le segment de code
    	Org 100h			; Apres le PSP, entete d'un fichier executable DOS
     
    Main Proc				; procedure principale
    	JMP Debut			; saute au debut
     
    ; Variables definit pour le programme DOS de copie sur disquettes ______________
     
    Buffer	DB 1024 Dup(0)
    Ok	DB "Copie Ok.",10,13,"La disquette boot est OK, vous pouvez redemarrer votre PC.",10,13,0
    Erreur	DB "Erreur de copie sur disquette",10,13,0
    Message	DB "Introduisez une disquette vierge dans le lecteur A:",10,13,0
    Nb_Err	DB 0
    fichier DB "PROGRAM2.EXE",0
    OkFile  DB "OK Fichier",10,13,0
    ErrFile DB "Erreur fichier",10,13,0
     
    ; Debut du code de copie sur disquette _________________________________________
     
    Debut:				; initialisation
    	Mov Ax, Cs			; C'est un .COM, donc 1 segment suffit.
    	Mov Ds, Ax			; DS = segment data = segment code pour un .COM
    	Mov Es, Ax			; ES = segment de son choix
    	mov si, offset Message	; impression du message
    	call	printf
    	Mov Ah, 00h			; attente d'un appuie sur touche
    	Int 16h
     
    	Mov Si, Offset codeACopier	; adresse source du code a copier ( DS:SI )
    	Mov Di, Offset Buffer		; adresse de destination ( DS:DI )
    	Mov Cx, 512			; on copie 512 octet dans le buffer
    	Rep MovSB
     
            Mov Ax, 0
    	Mov Cx, 1
    	call copieDisk
    	Mov Ax, Cx
    	call hex2ascii
     
    	call lireFichier
     
            Mov Ax, 0                       ; copie du 2eme secteur disquette
            Mov Cx, 2                       ; issue du programme PROGRAM2.EXE
    	call copieDisk
    	Mov Ax, Cx
    	call hex2ascii
     
            Mov Ax, 512                     ; copie du 3eme secteur disquette
            Mov Cx, 3                       ; issue du programme PROGRAM2.EXE
    	call copieDisk
    	Mov Ax, Cx
    	call hex2ascii
     
    	mov si, offset Ok		; Impression du message OK
    	call	printf
     
    	Mov Ax, 4C00h		        ; on quitte le programme MS DOS
    	Int 21h
     
    copieDisk:		                ; Ax decalage buffer, Cx secteur
            push Ax
    	push Cx
     
    Copie_Disquette:			; Copie du buffer sur la disquette
    	Mov Ah, 00h			; fonction 0 -> reset du disque
    	Mov Dl, 0			; index du lecteur
    	Int 13h
     
    	pop Cx			; CH numero de cylindre ( 8 dernier bits ), CL numero de secteur 1 a 63 ( bit 0 a 5 ) + 2 bit de cylindre ( 6 et 7 )
    	Lea Bx, Buffer		; ES:BX buffer du donnees
    	pop Ax
    	add Bx, Ax
    	Mov Ax, 0301h		; fonction 3 ecriture sur le secteur 1
    	Mov Dx, 0		; DH numero de tete, DL numero de lecteur
    	Int 13h
    	JNC Okay		; Jump si carry flag CF est a 0
     
    	Inc Nb_Err		; Si il y a eu une erreur
     
    	Cmp Nb_Err, 5		; moins de 5 erreurs on continue
    	JL Copie_Disquette
     
    	mov si, offset Erreur	; Impression du message
    	call	printf
     
    Okay:
    	nop
    	ret
     
    lireFichier:
            push ax
            push dx
     
            ; ouverture du fichier
            mov ax, 3D80h
            mov dx, offset fichier
            int 21h
     
            JNC fichier_ouvert
     
            mov si, offset ErrFile		; Impression du message erreur
    	call	printf
    	call hex2ascii                  ; Impression du code d'erreur dans AX
    	jmp fichier_fin
     
    fichier_ouvert:
     
            push ax
     
            mov si, offset OkFile		; Impression du message erreur
    	call	printf
     
            pop ax
            mov bx, ax
            push ax	
    	mov ax, 4200h                    ; deplacemennt de 512 octets
    	mov cx, 0
    	mov dx, 200h
    	int 21h
     
    	pop ax
            mov bx, ax
            push ax
            mov ax, 3F00h                   ; lecture du fichier
            mov cx, 1024
            mov dx, offset buffer
            int 21h
     
            pop ax
            mov bx, ax                      ; On met le handle du fichier dans BX
            mov ax, 3E00h
            int 21h
     
    fichier_fin:
     
            pop dx
            pop ax
            ret
     
     
    ; Code est copié sur disquette et sera exécuté lors du BOOT ____________________
     
    codeACopier:
    	mov ax, 07C0h	; Le boot est copie en 0000:7C00 ou 07C0:0000
    	mov ds, ax
    	mov es, ax
    	mov ax, 8000h	; stack en 0xFFFF
    	mov ss, ax
    	mov sp, 0f000h
     
    ; la pile qui commence en 0x8F000 et finit en 0x80000 ( SS:SP )
    ; le segment de donnees qui commence en 0x07C00 et finit en 0x17C00 ( 0000:7C00 a 1000:7C00 )
    ; le secteur de boot charge en 0x07C00 et qui finit en 0x07CFF. ( 0000:7C00 a 0000:7CFF )
     
    ; Initialisation des vecteur d'interruption ____________________________________
     
    	push ax
    	push es
    	xor ax,ax
    	mov es,ax				; Es <--- 0
    	mov word [es:21h*4], offset int21	; Initialisation du vecteur
    	mov word [es:21h*4+2], cs		; de l'interruption, CS code segment
    	pop es
    	pop ax
     
    ; code _________________________________________________________________________
     
    	mov ax, 0012h	; 640x480x16
    	int 10h
     
    	mov ax, offset toto
    	sub ax, offset codeACopier	; lors de la compilation du .COM l'offet et par rapport a celui-ci !!!
    	mov si, ax		        ; Impression d'un message
    	call printf
     
    	mov ax, 00h
    boucle:
    	call hex2ascii
    	inc ax
    	cmp ax, 100h
    	jne boucle
     
    	mov ax, offset toto
    	sub ax, offset codeACopier	; lors de la compilation du .COM l'offet et par rapport a celui-ci !!!
    	mov si, ax		        ; Impression d'un message
    	call printf
     
            Mov Ax, 0             ; charge en 7E00
    	Mov Cx, 2             ; 2eme secteur de le disquette en memoire
    	call lireDisk
     
            Mov Ax, 512           ; charge en 8000
    	Mov Cx, 3             ; 3eme secteur de le disquette en memoire
    	call lireDisk
     
    	mov ax, offset titi
    	sub ax, offset codeACopier	; lors de la compilation du .COM l'offet et par rapport a celui-ci !!!
    	mov si, ax		; Impression d'un message
    	call printf
     
    	jmp suite		; On saute sur la suite du programme
     
    toto	DB "Noopsy 32",10,13,0
    titi	DB "Lecture OK",10,13,0
     
    printf:
    	push ax
    	push bx
    printf_debut:
    	lodsb			; ds:si -> al
    	cmp al,0		; fin chaine ?
    	jz printf_fin
    	mov ah,0Eh		; appel au service 0x0e, int 0x10 du bios
    	mov bx,02h		; bx -> attribut, al -> caractere ascii
    	int 10h
    	jmp printf_debut
    printf_fin:
    	pop bx
    	pop ax
    	ret
     
    ; AH = 02h
    ; AL = number of sectors to read (must be nonzero)
    ; CH = low eight bits of cylinder number
    ; CL = sector number 1-63 (bits 0-5)
    ; high two bits of cylinder (bits 6-7, hard disk only)
    ; DH = head number
    ; DL = drive number (bit 7 set for hard disk)
    ; ES:BX -> data buffer
    lireDisk:
            push Ax
    	push Cx
     
    Lire_Disquette:			; Copie du buffer sur la disquette
    	Mov Ah, 00h			; fonction 0 -> reset du disque
    	Mov Dl, 0			; index du lecteur
    	Int 13h
     
     
    	pop Cx			; CH numero de cylindre ( 8 dernier bits ), CL numero de secteur 1 a 63 ( bit 0 a 5 ) + 2 bit de cylindre ( 6 et 7 )
    	Mov Bx, 7E00h		; ES:BX buffer du donnees -> 7C00 + 200 ( 512 ) = 7E00
    	pop Ax
    	Add Bx, Ax
    	Mov Ax, 0201h		; fonction 2 lecture secteur 1
    	Mov Dx, 0			; DH numero de tete, DL numero de lecteur
    	Int 13h
    	JNC Ouais			; Jump si carry flag CF est a 0
     
    	;Inc Nb_Err			; Si il y a eu une erreur
     
    	;Cmp Nb_Err, 5		; moins de 5 erreurs on continue
    	;JL Lire_Disquette
     
    	mov ax, offset Erreur
    	sub ax, offset codeACopier	; lors de la compilation du .COM l'offet et par rapport a celui-ci !!!
    	mov si, ax			; Impression d'un message
    	call	printf
     
    Ouais:
    	nop
    	ret
     
    hex2ascii:
    	push ax		; on sauve AX
    	push bx
    	push dx		; on sauve DX
    	mov dl, 10h
    	div dl		; 1C -> 28 / 16 -> 1 dans AL, reste dans AH
     
    	cmp al, 0Ah		; converssion AL en 0 -> F
    	jne passeA
    	mov dl, 'A'
    	jmp finConv
    passeA:
    	cmp al, 0Bh		; converssion AL en 0 -> F
    	jne passeB
    	mov dl, 'B'
    	jmp finConv
    passeB:
    	cmp al, 0Ch		; converssion AL en 0 -> F
    	jne passeC
    	mov dl, 'C'
    	jmp finConv
    passeC:
    	cmp al, 0Dh		; converssion AL en 0 -> F
    	jne passeD
    	mov dl, 'D'
    	jmp finConv
    passeD:
    	cmp al, 0Eh		; converssion AL en 0 -> F
    	jne passeE
    	mov dl, 'E'
    	jmp finConv
    passeE:
    	cmp al, 0Fh		; converssion AL en 0 -> F
    	jne passeF
    	mov dl, 'F'
    	jmp finConv
    passeF:
    	add al, 30h		; converssion en nombre
    	mov dl, al
     
    finConv:
    	cmp ah, 0Ah		; converssion AL en 0 -> F
    	jne passeA2
    	mov dh, 'A'
    	jmp finConv2
    passeA2:
    	cmp ah, 0Bh		; converssion AL en 0 -> F
    	jne passeB2
    	mov dh, 'B'
    	jmp finConv2
    passeB2:
    	cmp ah, 0Ch		; converssion AL en 0 -> F
    	jne passeC2
    	mov dh, 'C'
    	jmp finConv2
    passeC2:
    	cmp ah, 0Dh		; converssion AL en 0 -> F
    	jne passeD2
    	mov dh, 'D'
    	jmp finConv2
    passeD2:
    	cmp ah, 0Eh		; converssion AL en 0 -> F
    	jne passeE2
    	mov dh, 'E'
    	jmp finConv2
    passeE2:
    	cmp ah, 0Fh		; converssion AL en 0 -> F
    	jne passeF2
    	mov dh, 'F'
    	jmp finConv2
    passeF2:
    	add ah, 30h		; converssion en nombre
    	mov dh, ah
     
    finConv2:
    	Mov Ah, 0Eh
    	Mov Al, '['
    	Mov Bl, 3
    	Int 10h
    	Mov Al, dl
    	Int 10h
    	Mov Al, ':'
    	Int 10h
    	Mov Al, dh
    	Int 10h
    	Mov Al, ']'
    	Int 10h
    	pop DX
    	pop BX
    	pop AX
    	ret
     
    int21:
    	nop
    	iret
     
            db 174 Dup(144)	; remplissage
    	dw 0AA55h		; mot magique
     
    ; code a copier dans le 2eme secteur de la disquette
     
    suite:  ; On arrive ici et on se branche sur le code de program.exe
     
    ; Fin du code a copier sur la disquette ________________________________________
     
    Main EndP
    Code EndS
    End Main
    et le source ( simple ) du programme DOS:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    P386
     
    Mon_Code SEGMENT USE16
     
        ASSUME CS:Mon_Code, DS:Donnees, SS:Pile
     
    Debut :
        Mov Ah, 0Eh
        Mov Al, 'T'
        Mov Bl, 3
        Int 10h
        Mov Al, 'E'
        Int 10h
        Mov Al, 'S'
        Int 10h
        Mov Al, 'T'
        Int 10h
        Mov Al, '1'
        Int 10h
        Mov Ah, 00h		; attente appuie sur touche
        Int 16h
     
        mov si, offset texte ; Impression du message de test
        call printf	
     
        Mov Ah, 0Eh
        Mov Al, 'T'
        Mov Bl, 3
        Int 10h
        Mov Al, 'E'
        Int 10h
        Mov Al, 'S'
        Int 10h
        Mov Al, 'T'
        Int 10h
        Mov Al, '2'
        Int 10h
        Mov Ah, 00h		; attente appuie sur touche
        Int 16h
     
        Int 19h		; reboot
     
    printf:
        push ax
        push bx
    printf_debut:
        lodsb			; ds:si -> al
        cmp al,0		; fin chaine ?
        jz printf_fin
        mov ah,0Eh		; appel au service 0x0e, int 0x10 du bios
        mov bx,02h		; bx -> attribut, al -> caractere ascii
        int 10h
        jmp printf_debut
    printf_fin:
        pop bx
        pop ax
        ret
     
    Mon_Code ENDS
     
    Donnees SEGMENT USE16
        texte DB "ca marche !",10,13,0
    Donnees ENDS
     
    Pile SEGMENT STACK USE16
        DB 512 DUP (0)
    Pile ENDS
     
    END Debut
    Donc le bios charge mon 1er secteur en 0000:7C00, ca demarre sans probleme. Le jmp suite du programme de boot est la pour sauter a l'adresse 0000:7E00, la ou je met le debut de mon programme EXE ( PROGRAM2.EXE ), jusque la ca marche, il m'affiche bien TEST1 et TEST2, mais entre les deux mon appel a printf ( ma procedure pour imprimer du texte ) foire, en fait le pense qu'il ne trouve pas l'adresse exacte du texte. Comment faire pour refaire pointer le segment de donnée vers

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Donnees SEGMENT USE16
        texte DB "ca marche !",10,13,0
    Donnees ENDS
    Merci par avance !

  2. #2
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    272
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 272
    Points : 166
    Points
    166
    Par défaut Avancement
    Re,

    J'arrive a imprimer le texte en faisant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    P386
     
    Mon_Code SEGMENT USE16
     
        ASSUME CS:Mon_Code, DS:Donnees, SS:Pile
     
    Debut :
        mov si, offset finCode
        mov ax, si
        mov bl, 10h
        div bl
        mul bl
        add ax, 10h
        add ax, 7E00h
        mov si, ax
        ;div bl         ; 7E60 ( offset ) vers 07E6 ( segment ) car
        ;mov ds, ax     ; 0000:7E60 = 07E6:0000
     
        Mov Ah, 0Eh
        Mov Al, 'T'
        Mov Bl, 3
        Int 10h
        Mov Al, 'E'
        Int 10h
        Mov Al, 'S'
        Int 10h
        Mov Al, 'T'
        Int 10h
        Mov Al, '1'
        Int 10h
     
        ;mov si, offset text2 ; Impression du message de test
        call printf	
     
        Mov Ah, 0Eh
        Mov Al, 'T'
        Mov Bl, 3
        Int 10h
        Mov Al, 'E'
        Int 10h
        Mov Al, 'S'
        Int 10h
        Mov Al, 'T'
        Int 10h
        Mov Al, '2'
        Int 10h
        Mov Ah, 00h		; attente appuie sur touche
        Int 16h
     
        Int 19h		; reboot
     
    printf:
        push ax
        push bx
    printf_debut:
        lodsb		; ds:si -> al
        cmp al,0		; fin chaine ?
        jz printf_fin
        mov ah,0Eh		; appel au service 0x0e, int 0x10 du bios
        mov bx,02h		; bx -> attribut, al -> caractere ascii
        int 10h
        jmp printf_debut
    printf_fin:
        pop bx
        pop ax
        ret
     
    finCode:
     
    Mon_Code ENDS
     
    Donnees SEGMENT USE16
        texte DB "ca marche !",10,13,0
    Donnees ENDS
     
    Pile SEGMENT STACK USE16
        DB 512 DUP (0FFh)
    Pile ENDS
     
    END Debut
    J'ai ajouter ce bout de code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    mov si, offset finCode
        mov ax, si
        mov bl, 10h
        div bl
        mul bl
        add ax, 10h
        add ax, 7E00h
        mov si, ax
        ;mov ds, ax
    et ajouter un label finCode: avant Mon_Code ENDS, mon segment de donnee se trouvant juste apres mon segment de code. Si mon code s'arrete a l'offset 0254h par exemple, le segment de donnees commencera a 0260h, donc le prend l'offset de finCode: ( 0254h ) je le divise et le multiplie par 10h, ce qui donne: 254h / 10h = 25h, x 10h = 250h, + 10h = 260h ( je suis sur l'offset du segment de donnees ), + 7E00h ( car lors du lancement le bios copie mon boot secteur entre 7C00 et 7E00, ensuite c'est le code de mon programme qui reprend le relais. probleme, en faisant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ;mov si, ax
        div bl         ; 7E60 ( offset ) vers 07E6 ( segment ) car
        mov ds, ax     ; 0000:7E60 = 07E6:0000
    et en decommentant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    mov si, offset texte ; Impression du message de test
        call printf
    Cela ne marche plus, pourtant si = 0, normal par rapport au debut du segment de donnees, mon texte se trouve au debut, et j'essai de renseigner le segment de donnees au lieu de l'offset, donc comme mon texte se trouve a l'offset 7E60, si je met 07E6 en segment dans DS, et 0 dans SI, il devrait retrouver mon texte ? vu que 0000:7E60 = 07E6:0000 ( DS:SI ) ?

    Quelqu'un a-t-il une idée ?

    Merci par avance !

  3. #3
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    272
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 272
    Points : 166
    Points
    166
    Par défaut Oh le boulet :o)
    Bonjour,

    En fait l'erreur venait de la fonction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    lireDisk:
            push Ax
    	push Cx
     
    Lire_Disquette:			; Copie du buffer sur la disquette
    	Mov Ah, 00h			; fonction 0 -> reset du disque
    	Mov Dl, 0			; index du lecteur
    	Int 13h
     
     
    	pop Cx			; CH numero de cylindre ( 8 dernier bits ), CL numero de secteur 1 a 63 ( bit 0 a 5 ) + 2 bit de cylindre ( 6 et 7 )
    	Mov Bx, 7E00h		; ES:BX buffer du donnees -> 7C00 + 200 ( 512 ) = 7E00
    	pop Ax
    	Add Bx, Ax
    	Mov Ax, 0201h		; fonction 2 lecture secteur 1
    	Mov Dx, 0			; DH numero de tete, DL numero de lecteur
    	Int 13h
    	JNC Ouais			; Jump si carry flag CF est a 0
     
    	;Inc Nb_Err			; Si il y a eu une erreur
     
    	;Cmp Nb_Err, 5		; moins de 5 erreurs on continue
    	;JL Lire_Disquette
     
    	mov ax, offset Erreur
    	sub ax, offset codeACopier	; lors de la compilation du .COM l'offet et par rapport a celui-ci !!!
    	mov si, ax			; Impression d'un message
    	call	printf
     
    Ouais:
    	nop
    	ret
    Dedant je fais un:

    Mais comme ES est deja initialisé a 07C0 il faut faire :

    Ce qui fait ES:BX = 07C0:0200 soit 7C00+200=7E00 on retombe bien sur nos pattes.

    Cela n'empechait pas le programme de fonctionner car la zone situé entre la fin du boot et le début de programme contenait que des zéros, soit:

    Mais le segment de donnée ne pointait sur rien, enfin sur des zéros.

    Merci de vos reponses.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 7
    Dernier message: 16/05/2007, 13h26
  2. Problème de déclaration de segment avec use32
    Par le mage tophinus dans le forum Assembleur
    Réponses: 2
    Dernier message: 10/01/2003, 10h17
  3. [VB6] [Interface] Horloge 7 segments
    Par selenay dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 07/10/2002, 16h15
  4. [TASM] Déclarer le segment de pile
    Par cipher dans le forum x86 16-bits
    Réponses: 2
    Dernier message: 01/10/2002, 03h58
  5. angle entre 2 segments
    Par tane dans le forum Mathématiques
    Réponses: 4
    Dernier message: 25/09/2002, 16h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo