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

Assembleur Discussion :

Adresse de début du segment de données


Sujet :

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 Adresse de début du segment de données
    Bonjour,

    Si je fais un petit programme en C comme ceci:

    Code C : 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
    void clrscr();
    void print(const char *_message);
     
    main()
    {
       clrscr();
       print( "toto" );
       return(0);
    }
     
    unsigned char inp(unsigned short port)
    {
       unsigned char valeur;
       asm {
          mov DX, port
          in AL,DX
          mov valeur,AL
       }
       return( valeur );
    }
     
    void outp(unsigned short port, unsigned char valeur)
    {
       asm {
          mov DX, port
          mov AL, valeur
          out DX, AL
       }
    }
     
    void clrscr()
    {
       unsigned char *vidmem = (unsigned char *)0xB8000;
       const long size = 80*25;
       long loop;
     
       // Clear visible video memory
       for (loop=0; loop<size; loop++) 
       {
          *vidmem++ = 0;
          *vidmem++ = 0xF;
       }
     
       // Set cursor position to 0,0
       outp(0x3D4, 14);
       outp(0x3D5, 0);
       outp(0x3D4, 15);
       outp(0x3D5, 0);
    }
     
    void print(const char *_message)
    {
       unsigned short offset;
       unsigned long i;
       unsigned char *vidmem = (unsigned char *)0xB8000;
     
       // Read cursor position
       outp(0x3D4, 14);
       offset = inp(0x3D5) << 8;
       outp(0x3D4, 15);
       offset |= inp(0x3D5);
     
       // Start at writing at cursor position
       vidmem += offset*2;
     
       // Continue until we reach null character
       i = 0;
       while (_message[i] != 0) 
       {
          *vidmem = _message[i++];
          vidmem += 2;
       }
     
       // Set new cursor position
       offset += i;
       outp(0x3D5, (unsigned char)(offset));
       outp(0x3D4, 14);
       outp(0x3D5, (unsigned char)(offset >> 8));
    }

    qui permet d'effacer l'ecran et d'ecrire "toto", que je le compile avec tc et tlink, et que je le desassemble avec ndisasm j'ai:

    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
    372
    373
    374
    375
    376
    377
    378
    379
    380
    381
    382
    383
    384
    385
    386
    387
    388
    389
    390
    391
    392
    393
    394
    395
    396
    397
    398
    399
    400
    401
    402
    403
    404
    405
    406
    407
    408
    409
    410
    411
    412
    413
    414
    415
    416
    417
    418
    419
    420
    421
    422
    423
    424
    425
    00000000  4D                dec bp
    00000001  5A                pop dx
    00000002  5B                pop bx
    00000003  0102              add [bp+si],ax
    00000005  0000              add [bx+si],al
    00000007  0020              add [bx+si],ah
    00000009  0001              add [bx+di],al
    0000000B  00FF              add bh,bh
    0000000D  FF00              inc word [bx+si]
    0000000F  0000              add [bx+si],al
    00000011  0000              add [bx+si],al
    00000013  0000              add [bx+si],al
    00000015  0000              add [bx+si],al
    00000017  003E0000          add [0x0],bh
    0000001B  0001              add [bx+di],al
    0000001D  00FB              add bl,bh
    0000001F  306A72            xor [bp+si+0x72],ch
    00000022  0000              add [bx+si],al
    00000024  0000              add [bx+si],al
    00000026  0000              add [bx+si],al
    00000028  0000              add [bx+si],al
    0000002A  0000              add [bx+si],al
    0000002C  0000              add [bx+si],al
    0000002E  0000              add [bx+si],al
    00000030  0000              add [bx+si],al
    00000032  0000              add [bx+si],al
    00000034  0000              add [bx+si],al
    00000036  0000              add [bx+si],al
    00000038  0000              add [bx+si],al
    0000003A  0000              add [bx+si],al
    0000003C  0000              add [bx+si],al
    0000003E  0000              add [bx+si],al
    00000040  0000              add [bx+si],al
    00000042  0000              add [bx+si],al
    00000044  0000              add [bx+si],al
    00000046  0000              add [bx+si],al
    00000048  0000              add [bx+si],al
    0000004A  0000              add [bx+si],al
    0000004C  0000              add [bx+si],al
    0000004E  0000              add [bx+si],al
    00000050  0000              add [bx+si],al
    00000052  0000              add [bx+si],al
    00000054  0000              add [bx+si],al
    00000056  0000              add [bx+si],al
    00000058  0000              add [bx+si],al
    0000005A  0000              add [bx+si],al
    0000005C  0000              add [bx+si],al
    0000005E  0000              add [bx+si],al
    00000060  0000              add [bx+si],al
    00000062  0000              add [bx+si],al
    00000064  0000              add [bx+si],al
    00000066  0000              add [bx+si],al
    00000068  0000              add [bx+si],al
    0000006A  0000              add [bx+si],al
    0000006C  0000              add [bx+si],al
    0000006E  0000              add [bx+si],al
    00000070  0000              add [bx+si],al
    00000072  0000              add [bx+si],al
    00000074  0000              add [bx+si],al
    00000076  0000              add [bx+si],al
    00000078  0000              add [bx+si],al
    0000007A  0000              add [bx+si],al
    0000007C  0000              add [bx+si],al
    0000007E  0000              add [bx+si],al
    00000080  0000              add [bx+si],al
    00000082  0000              add [bx+si],al
    00000084  0000              add [bx+si],al
    00000086  0000              add [bx+si],al
    00000088  0000              add [bx+si],al
    0000008A  0000              add [bx+si],al
    0000008C  0000              add [bx+si],al
    0000008E  0000              add [bx+si],al
    00000090  0000              add [bx+si],al
    00000092  0000              add [bx+si],al
    00000094  0000              add [bx+si],al
    00000096  0000              add [bx+si],al
    00000098  0000              add [bx+si],al
    0000009A  0000              add [bx+si],al
    0000009C  0000              add [bx+si],al
    0000009E  0000              add [bx+si],al
    000000A0  0000              add [bx+si],al
    000000A2  0000              add [bx+si],al
    000000A4  0000              add [bx+si],al
    000000A6  0000              add [bx+si],al
    000000A8  0000              add [bx+si],al
    000000AA  0000              add [bx+si],al
    000000AC  0000              add [bx+si],al
    000000AE  0000              add [bx+si],al
    000000B0  0000              add [bx+si],al
    000000B2  0000              add [bx+si],al
    000000B4  0000              add [bx+si],al
    000000B6  0000              add [bx+si],al
    000000B8  0000              add [bx+si],al
    000000BA  0000              add [bx+si],al
    000000BC  0000              add [bx+si],al
    000000BE  0000              add [bx+si],al
    000000C0  0000              add [bx+si],al
    000000C2  0000              add [bx+si],al
    000000C4  0000              add [bx+si],al
    000000C6  0000              add [bx+si],al
    000000C8  0000              add [bx+si],al
    000000CA  0000              add [bx+si],al
    000000CC  0000              add [bx+si],al
    000000CE  0000              add [bx+si],al
    000000D0  0000              add [bx+si],al
    000000D2  0000              add [bx+si],al
    000000D4  0000              add [bx+si],al
    000000D6  0000              add [bx+si],al
    000000D8  0000              add [bx+si],al
    000000DA  0000              add [bx+si],al
    000000DC  0000              add [bx+si],al
    000000DE  0000              add [bx+si],al
    000000E0  0000              add [bx+si],al
    000000E2  0000              add [bx+si],al
    000000E4  0000              add [bx+si],al
    000000E6  0000              add [bx+si],al
    000000E8  0000              add [bx+si],al
    000000EA  0000              add [bx+si],al
    000000EC  0000              add [bx+si],al
    000000EE  0000              add [bx+si],al
    000000F0  0000              add [bx+si],al
    000000F2  0000              add [bx+si],al
    000000F4  0000              add [bx+si],al
    000000F6  0000              add [bx+si],al
    000000F8  0000              add [bx+si],al
    000000FA  0000              add [bx+si],al
    000000FC  0000              add [bx+si],al
    000000FE  0000              add [bx+si],al
    00000100  0000              add [bx+si],al
    00000102  0000              add [bx+si],al
    00000104  0000              add [bx+si],al
    00000106  0000              add [bx+si],al
    00000108  0000              add [bx+si],al
    0000010A  0000              add [bx+si],al
    0000010C  0000              add [bx+si],al
    0000010E  0000              add [bx+si],al
    00000110  0000              add [bx+si],al
    00000112  0000              add [bx+si],al
    00000114  0000              add [bx+si],al
    00000116  0000              add [bx+si],al
    00000118  0000              add [bx+si],al
    0000011A  0000              add [bx+si],al
    0000011C  0000              add [bx+si],al
    0000011E  0000              add [bx+si],al
    00000120  0000              add [bx+si],al
    00000122  0000              add [bx+si],al
    00000124  0000              add [bx+si],al
    00000126  0000              add [bx+si],al
    00000128  0000              add [bx+si],al
    0000012A  0000              add [bx+si],al
    0000012C  0000              add [bx+si],al
    0000012E  0000              add [bx+si],al
    00000130  0000              add [bx+si],al
    00000132  0000              add [bx+si],al
    00000134  0000              add [bx+si],al
    00000136  0000              add [bx+si],al
    00000138  0000              add [bx+si],al
    0000013A  0000              add [bx+si],al
    0000013C  0000              add [bx+si],al
    0000013E  0000              add [bx+si],al
    00000140  0000              add [bx+si],al
    00000142  0000              add [bx+si],al
    00000144  0000              add [bx+si],al
    00000146  0000              add [bx+si],al
    00000148  0000              add [bx+si],al
    0000014A  0000              add [bx+si],al
    0000014C  0000              add [bx+si],al
    0000014E  0000              add [bx+si],al
    00000150  0000              add [bx+si],al
    00000152  0000              add [bx+si],al
    00000154  0000              add [bx+si],al
    00000156  0000              add [bx+si],al
    00000158  0000              add [bx+si],al
    0000015A  0000              add [bx+si],al
    0000015C  0000              add [bx+si],al
    0000015E  0000              add [bx+si],al
    00000160  0000              add [bx+si],al
    00000162  0000              add [bx+si],al
    00000164  0000              add [bx+si],al
    00000166  0000              add [bx+si],al
    00000168  0000              add [bx+si],al
    0000016A  0000              add [bx+si],al
    0000016C  0000              add [bx+si],al
    0000016E  0000              add [bx+si],al
    00000170  0000              add [bx+si],al
    00000172  0000              add [bx+si],al
    00000174  0000              add [bx+si],al
    00000176  0000              add [bx+si],al
    00000178  0000              add [bx+si],al
    0000017A  0000              add [bx+si],al
    0000017C  0000              add [bx+si],al
    0000017E  0000              add [bx+si],al
    00000180  0000              add [bx+si],al
    00000182  0000              add [bx+si],al
    00000184  0000              add [bx+si],al
    00000186  0000              add [bx+si],al
    00000188  0000              add [bx+si],al
    0000018A  0000              add [bx+si],al
    0000018C  0000              add [bx+si],al
    0000018E  0000              add [bx+si],al
    00000190  0000              add [bx+si],al
    00000192  0000              add [bx+si],al
    00000194  0000              add [bx+si],al
    00000196  0000              add [bx+si],al
    00000198  0000              add [bx+si],al
    0000019A  0000              add [bx+si],al
    0000019C  0000              add [bx+si],al
    0000019E  0000              add [bx+si],al
    000001A0  0000              add [bx+si],al
    000001A2  0000              add [bx+si],al
    000001A4  0000              add [bx+si],al
    000001A6  0000              add [bx+si],al
    000001A8  0000              add [bx+si],al
    000001AA  0000              add [bx+si],al
    000001AC  0000              add [bx+si],al
    000001AE  0000              add [bx+si],al
    000001B0  0000              add [bx+si],al
    000001B2  0000              add [bx+si],al
    000001B4  0000              add [bx+si],al
    000001B6  0000              add [bx+si],al
    000001B8  0000              add [bx+si],al
    000001BA  0000              add [bx+si],al
    000001BC  0000              add [bx+si],al
    000001BE  0000              add [bx+si],al
    000001C0  0000              add [bx+si],al
    000001C2  0000              add [bx+si],al
    000001C4  0000              add [bx+si],al
    000001C6  0000              add [bx+si],al
    000001C8  0000              add [bx+si],al
    000001CA  0000              add [bx+si],al
    000001CC  0000              add [bx+si],al
    000001CE  0000              add [bx+si],al
    000001D0  0000              add [bx+si],al
    000001D2  0000              add [bx+si],al
    000001D4  0000              add [bx+si],al
    000001D6  0000              add [bx+si],al
    000001D8  0000              add [bx+si],al
    000001DA  0000              add [bx+si],al
    000001DC  0000              add [bx+si],al
    000001DE  0000              add [bx+si],al
    000001E0  0000              add [bx+si],al
    000001E2  0000              add [bx+si],al
    000001E4  0000              add [bx+si],al
    000001E6  0000              add [bx+si],al
    000001E8  0000              add [bx+si],al
    000001EA  0000              add [bx+si],al
    000001EC  0000              add [bx+si],al
    000001EE  0000              add [bx+si],al
    000001F0  0000              add [bx+si],al
    000001F2  0000              add [bx+si],al
    000001F4  0000              add [bx+si],al
    000001F6  0000              add [bx+si],al
    000001F8  0000              add [bx+si],al
    000001FA  0000              add [bx+si],al
    000001FC  0000              add [bx+si],al
    000001FE  0000              add [bx+si],al
    00000200  55                push bp
    00000201  8BEC              mov bp,sp
    00000203  E82F00            call 0x235
    00000206  B80600            mov ax,0x6
    00000209  50                push ax
    0000020A  E89F00            call 0x2ac
    0000020D  59                pop cx
    0000020E  33C0              xor ax,ax
    00000210  EB00              jmp short 0x212
    00000212  5D                pop bp
    00000213  C3                ret
    00000214  55                push bp
    00000215  8BEC              mov bp,sp
    00000217  4C                dec sp
    00000218  4C                dec sp
    00000219  8B5604            mov dx,[bp+0x4]
    0000021C  EC                in al,dx
    0000021D  8846FF            mov [bp-0x1],al
    00000220  8A46FF            mov al,[bp-0x1]
    00000223  EB00              jmp short 0x225
    00000225  8BE5              mov sp,bp
    00000227  5D                pop bp
    00000228  C3                ret
    00000229  55                push bp
    0000022A  8BEC              mov bp,sp
    0000022C  8B5604            mov dx,[bp+0x4]
    0000022F  8A4606            mov al,[bp+0x6]
    00000232  EE                out dx,al
    00000233  5D                pop bp
    00000234  C3                ret
    00000235  55                push bp
    00000236  8BEC              mov bp,sp
    00000238  83EC08            sub sp,byte +0x8
    0000023B  56                push si
    0000023C  BE0080            mov si,0x8000
    0000023F  C746FCD007        mov word [bp-0x4],0x7d0
    00000244  C746FE0000        mov word [bp-0x2],0x0
    00000249  C746F80000        mov word [bp-0x8],0x0
    0000024E  C746FA0000        mov word [bp-0x6],0x0
    00000253  EB10              jmp short 0x265
    00000255  C60400            mov byte [si],0x0
    00000258  46                inc si
    00000259  C6040F            mov byte [si],0xf
    0000025C  46                inc si
    0000025D  8346F801          add word [bp-0x8],byte +0x1
    00000261  8356FA00          adc word [bp-0x6],byte +0x0
    00000265  8B46FA            mov ax,[bp-0x6]
    00000268  8B56F8            mov dx,[bp-0x8]
    0000026B  3B46FE            cmp ax,[bp-0x2]
    0000026E  7CE5              jl 0x255
    00000270  7505              jnz 0x277
    00000272  3B56FC            cmp dx,[bp-0x4]
    00000275  72DE              jc 0x255
    00000277  B00E              mov al,0xe
    00000279  50                push ax
    0000027A  B8D403            mov ax,0x3d4
    0000027D  50                push ax
    0000027E  E8A8FF            call 0x229
    00000281  59                pop cx
    00000282  59                pop cx
    00000283  B000              mov al,0x0
    00000285  50                push ax
    00000286  B8D503            mov ax,0x3d5
    00000289  50                push ax
    0000028A  E89CFF            call 0x229
    0000028D  59                pop cx
    0000028E  59                pop cx
    0000028F  B00F              mov al,0xf
    00000291  50                push ax
    00000292  B8D403            mov ax,0x3d4
    00000295  50                push ax
    00000296  E890FF            call 0x229
    00000299  59                pop cx
    0000029A  59                pop cx
    0000029B  B000              mov al,0x0
    0000029D  50                push ax
    0000029E  B8D503            mov ax,0x3d5
    000002A1  50                push ax
    000002A2  E884FF            call 0x229
    000002A5  59                pop cx
    000002A6  59                pop cx
    000002A7  5E                pop si
    000002A8  8BE5              mov sp,bp
    000002AA  5D                pop bp
    000002AB  C3                ret
    000002AC  55                push bp
    000002AD  8BEC              mov bp,sp
    000002AF  83EC06            sub sp,byte +0x6
    000002B2  56                push si
    000002B3  BE0080            mov si,0x8000
    000002B6  B00E              mov al,0xe
    000002B8  50                push ax
    000002B9  B8D403            mov ax,0x3d4
    000002BC  50                push ax
    000002BD  E869FF            call 0x229
    000002C0  59                pop cx
    000002C1  59                pop cx
    000002C2  B8D503            mov ax,0x3d5
    000002C5  50                push ax
    000002C6  E84BFF            call 0x214
    000002C9  59                pop cx
    000002CA  B400              mov ah,0x0
    000002CC  B108              mov cl,0x8
    000002CE  D3E0              shl ax,cl
    000002D0  8946FE            mov [bp-0x2],ax
    000002D3  B00F              mov al,0xf
    000002D5  50                push ax
    000002D6  B8D403            mov ax,0x3d4
    000002D9  50                push ax
    000002DA  E84CFF            call 0x229
    000002DD  59                pop cx
    000002DE  59                pop cx
    000002DF  B8D503            mov ax,0x3d5
    000002E2  50                push ax
    000002E3  E82EFF            call 0x214
    000002E6  59                pop cx
    000002E7  B400              mov ah,0x0
    000002E9  0946FE            or [bp-0x2],ax
    000002EC  8B46FE            mov ax,[bp-0x2]
    000002EF  D1E0              shl ax,1
    000002F1  03F0              add si,ax
    000002F3  C746FA0000        mov word [bp-0x6],0x0
    000002F8  C746FC0000        mov word [bp-0x4],0x0
    000002FD  EB14              jmp short 0x313
    000002FF  8B5E04            mov bx,[bp+0x4]
    00000302  035EFA            add bx,[bp-0x6]
    00000305  8A07              mov al,[bx]
    00000307  8804              mov [si],al
    00000309  8346FA01          add word [bp-0x6],byte +0x1
    0000030D  8356FC00          adc word [bp-0x4],byte +0x0
    00000311  46                inc si
    00000312  46                inc si
    00000313  8B5E04            mov bx,[bp+0x4]
    00000316  035EFA            add bx,[bp-0x6]
    00000319  803F00            cmp byte [bx],0x0
    0000031C  75E1              jnz 0x2ff
    0000031E  8B46FE            mov ax,[bp-0x2]
    00000321  0346FA            add ax,[bp-0x6]
    00000324  8946FE            mov [bp-0x2],ax
    00000327  8A46FE            mov al,[bp-0x2]
    0000032A  50                push ax
    0000032B  B8D503            mov ax,0x3d5
    0000032E  50                push ax
    0000032F  E8F7FE            call 0x229
    00000332  59                pop cx
    00000333  59                pop cx
    00000334  B00E              mov al,0xe
    00000336  50                push ax
    00000337  B8D403            mov ax,0x3d4
    0000033A  50                push ax
    0000033B  E8EBFE            call 0x229
    0000033E  59                pop cx
    0000033F  59                pop cx
    00000340  8B46FE            mov ax,[bp-0x2]
    00000343  B108              mov cl,0x8
    00000345  D3E8              shr ax,cl
    00000347  50                push ax
    00000348  B8D503            mov ax,0x3d5
    0000034B  50                push ax
    0000034C  E8DAFE            call 0x229
    0000034F  59                pop cx
    00000350  59                pop cx
    00000351  5E                pop si
    00000352  8BE5              mov sp,bp
    00000354  5D                pop bp
    00000355  C3                ret
    00000356  746F              jz 0x3c7
    00000358  746F              jz 0x3c9
    0000035A  00                db 0x00
    On voit bien ici:
    - le PSP d'un EXE entre 0 et 1FE
    - ma fonction main entre 200 et 213
    etc...
    et a la fin, entre 356 et 359 j'ai 746F746F qui correspond a "toto" en ASCII.

    Mon probleme, je compte charger ce code a partir du secteur 2 d'une disquette et l'appeler avec un boot code fait en assembleur. Deja j'ai mis me fonction main en 1er qui me permet de pointer sur l'octet situé en 200 et de retomber sur mon main ( en fait je passe l'entete PSP du fichier et je copie le reste sur la disquette ), donc je sais comment retomber sur mon main, mais je ne sais pas comment gerer mon pointeur sur le segment de DATA. En effet ma donnée "toto" se trouve en 356, a la ligne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    00000206  B80600            mov ax,0x6
    on voit qu'il met 6 dans AX, j'en deduit que mon segment de DATA doit etre 350, ou 150 si on enleve l'entete PSP. Mais ou trouver cette valeur ? Il n'est mis null par dans le PSP que le segment de DATA doit commencer en 150.
    Comment DOS peut-il initialiser le pointeur de segment de DATA ?

    En ce qui concerne la pile, comment la gerer aussi ? On lui met une adresse arbitraire ?

    Si quelqu'un a des idée...
    Le but c'est qu'ensuite ce bout de code en C fonctionne avec un boot fait maison. Il n'y a donc pas de support d'OS, donc pas d'utilisation des interruptions 21 du DOS ou 80 de Linux, et pas d'utilisation d'interruption du bios pour me permettre ensuite de reecrire ce code en mode protégé.

    Cordialement.

  2. #2
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 937
    Points : 59 416
    Points
    59 416
    Billets dans le blog
    2
    Par défaut
    Bonjour !

    Je pense que tu peux partir du principe que CS = DS = SS. L'éditeur de liens te permet-il de créer un .bin, au lieu d'un .exe ?
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  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 Bonne question
    Bonjour,

    J'utilise tlink de borland ( dispo avec turbo C++ dans les compilateurs gratos proposé par developpez.com ), quel est la difference entre un .exe et un .bin ? Le bin ne contient pas d'entete PSP ?

    Cordialement.

  4. #4
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 360
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 360
    Points : 20 378
    Points
    20 378
    Par défaut
    Citation Envoyé par Lovmy
    Bonjour,

    J'utilise tlink de borland ( dispo avec turbo C++ dans les compilateurs gratos proposé par developpez.com ), quel est la difference entre un .exe et un .bin ? Le bin ne contient pas d'entete PSP ?

    Cordialement.
    A ma connaissance oui , bin c'est du binaire brut.
    Aller voir sur www.wotsit.org
    Sinon pour le problème exposé cela ne sert strictement à rien de gérer PSP et autres.
    Parce que quand tu veux écrire ton propre OS c'est à toi de tout réecrire ! : la structure d'un exécutable, un noyau basique/interpréteur de commande/shell pour gérer la mémoire et les taches qui tournent.
    Donc effectivement si tu fais un programme en C et que tu le compiles, l'entête ne servira à rien sous ton propre OS ( à moins de sauter les 128 octets ...)

    Il n'y a donc pas de support d'OS, donc pas d'utilisation des interruptions 21 du DOS ou 80 de Linux, et pas d'utilisation d'interruption du bios pour me permettre ensuite de reecrire ce code en mode protégé.
    oui les int21 comme tu le sais c'est des interruptions du DOS ( y compris gestion de la mémoire paginée et étendue)
    Donc tu dois tout gérer toi même ; il y a des interruptions du BIOS qui permettent l'affichage
    on voit qu'il met 6 dans AX, j'en deduit que mon segment de DATA doit etre 350, ou 150 si on enleve l'entete PSP. Mais ou trouver cette valeur ? Il n'est mis null par dans le PSP que le segment de DATA doit commencer en 150.
    Comment DOS peut-il initialiser le pointeur de segment de DATA ?
    C'est à toi de tout gérer de définir la structure d'un exe l'adresse initiale des données l'autre pour le code etc...
    Comment DOS fait-il ? Eh bien il me semble que le pointeur de segment de DATA est renseigné dans le PSP , non ?

    .EXE - DOS EXE File Structure

    Offset Size Description

    00 word "MZ" - Link file .EXE signature (Mark Zbikowski?)
    02 word length of image mod 512
    04 word size of file in 512 byte pages
    06 word number of relocation items following header
    08 word size of header in 16 byte paragraphs, used to locate
    the beginning of the load module
    0A word min # of paragraphs needed to run program
    0C word max # of paragraphs the program would like
    0E word offset in load module of stack segment (in paras)
    10 word initial SP value to be loaded
    12 word negative checksum of pgm used while by EXEC loads pgm
    14 word program entry point, (initial IP value)
    16 word offset in load module of the code segment (in paras)
    18 word offset in .EXE file of first relocation item
    1A word overlay number (0 for root program)

    - relocation table and the program load module follow the header
    - relocation entries are 32 bit values representing the offset
    into the load module needing patched
    - once the relocatable item is found, the CS register is added to
    the value found at the calculated offset

    Registers at load time of the EXE file are as follows:

    AX: contains number of characters in command tail, or 0
    BX:CX 32 bit value indicating the load module memory size
    DX zero
    SS:SP set to stack segment if defined else, SS = CS and
    SP=FFFFh or top of memory.
    DS set to segment address of EXE header
    ES set to segment address of EXE header
    CS:IP far address of program entry point, (label on "END"
    statement of program)



    En ce qui concerne la pile, comment la gerer aussi ? On lui met une adresse arbitraire ?
    Meu non ; c'est au noyau que tu vas développer de calculer les plages d'adresses libres ! Ceci selon les programmes en mémoire.
    Pour le mode protégé à ma connaissance tout PC démarre en mode réel ( à moins que les nouveaux BIOS changent la donne ).
    Après à toi de gérer le passage en mode protégé
    Mais vaut mieux commencer d'abord en mode réel c'est plus simple tu n'as pas le multitache à gérer..

  5. #5
    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 J'ai des doute
    Bonjour,

    Dans http://benoit-m.developpez.com/assem.../Partie1-3.php
    il est dit que pour un EXE, DS pointe sur le debut de la PSP ( pour eventuellement pouvoir la lire ), mais je ne vois pas dans mon desassemblage du 1er post ou se trouve l'info dans le PSP, qui au passage a l'air de faire 512 octets au lieu de 128 ( 0 à 0x200 ).

    Il ajout "C'est donc au programmeur d'initialiser ces registres, s'il veut accéder à ses données." Mais comment je peux savoir ou debute mon segment de donnée ? On peut "bidouiller" en faisant un tag, genre un string qui contient "toto" et qui se trouve au debut de mes donnée, ce qui fait que quand je lance mon EXE apres mon boot, je scrute d'abors pour trouver ce tag "toto" et j'en deduit l'offset des donnée, puis mon segment, exemple:
    "toto" = 746F746F, je retrouve donc l'adresse 0x356, mais je ne pense pas que ce soit une methode tres propre.

    Cordialement.

  6. #6
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 360
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 360
    Points : 20 378
    Points
    20 378
    Par défaut
    Pour répondre rapidement ( si j'ai un peu plus de temps je regarderais plus attentivement ):
    *je crois que je me suis fait mal comprendre: si tu fais ton OS , la structure d'un EXE n'est plus valide à moins de vouloir reprendre explicitement cette structure.
    Pourquoi vouloir reprendre à tout prix cette structuration ?
    *pour toto dans le code source en C , c'est une chaine qui est constante ce n'est pas une variable ( de type char*) contenue à une certaine adresse

  7. #7
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 360
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 360
    Points : 20 378
    Points
    20 378
    Par défaut
    J'ai fait un décorticage de l'entête
    00000000 4D 'M'
    00000001 5A 'Z'
    00000002 5B 15B->Number of bytes in last 512-byte page of executable 200+15B =35B (code finit a 35A )
    00000003 01
    4 02 2 pages 35Bh=859 decimal soit 2 pages de 512 ( Total number of 512-byte pages in executable-including the last page)
    5 00
    6 00
    07 00
    08 20 -> taille entete en paragraphe-> 20h ? ou 20h*1 paragraphe ?
    09 00
    0a 01 1: Minimum paragraphs of memory allocated in addition to the code size
    0B 00
    0c FF FFFFh Maximum number of paragraphs allocated in addition to the code size
    0D FF
    0E 00
    0F 00
    10 00
    11 00
    12 00
    13 00
    14 00
    15 00
    16 00
    17 00
    18 3E 1 word Offset of relocation table; soit 3E00 soit offset 3E
    19 00
    1a 00 Overlay number ( word ) soit 0001 soit 1 overlay
    1B 01
    1c 00
    1D 00
    1E FB ->FB->version de TLink soit 30
    1F 30
    20 6A ->2 byte ??
    21 72
    il est dit que pour un EXE, DS pointe sur le debut de la PSP ( pour eventuellement pouvoir la lire ), mais je ne vois pas dans mon desassemblage du 1er post ou se trouve l'info dans le PSP, qui au passage a l'air de faire 512 octets au lieu de 128 ( 0 à 0x200 ).
    en fait non:
    *l'entête semble mesurer 20h octets
    * DS pointe à 200h +15B=35B soit la fin du programme.
    Pour se positionner sur la chaine de caractêres "toto" c'est ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    000002AC  55                push bp
    000002AD  8BEC              mov bp,sp
    000002AF  83EC06            sub sp,byte +0x6
     
     
    mov ax,0x6
    00000209  50                push ax
    c'est pour sauvegarder les 6 octets retranchés à sp lorsqu'on fait sub sp,byte +0x6 semble-t-il

    En fait la logique semble somme toute simple : le segment de données est à la suite du segment de code, les instructions le "savent" lors de la compilation du programme.
    Donc si on veut charger une chaine ou gérer une variable il suffit de se placer à la fin du programme - offset de la variable

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2005
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 14
    Points : 17
    Points
    17
    Par défaut
    salut ,

    Lorsque l'on desassemble le boot d'une disquette , il commence toujours par l'instruction JMP sur de début de la routine.
    Il est possible de modifier le boot en remplaçant ce JMP par d'autres instructions , mais dans TOUS les cas la première instruction exécutée est à l'adresse 0 du boot.
    Il est donc impossible de placé un fichier .EXE dans le boot parce à son adresse 0 il n'y a pas la première instruction mais le PSP.

    Je pense que tu as tord de te prendre la tete à chercher la valeur de DS ou ES : choisi celles qui t'arrange et si tu as l'intention de charger le système après ta routine, n'oublie pas de les sauvegarder au début et les rappeler à la fin.

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2005
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 14
    Points : 17
    Points
    17
    Par défaut
    PS: n'oublie aps qu'au moment de la lecture du boot , le système n'est pas encore chargé et que tu n'as à ta disposition que le BIOS

  10. #10
    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 Boot & exe
    Bonjour et merci de vos reponse.

    Cistamm, en fait je fais un .exe car je n'ai pas de parametres sur mon compilateur ( ou alors je ne l'ai pas trouvé ) pour lui dire de me faire du binaire pur. Mais cela n'a pas d'importance car j'ai deja crée mon code de boot en assembleur (voir http://www.developpez.net/forums/sho...d.php?t=274601) qui fonctionne tres bien. (Bon mise a part un petit probleme d'ou ce lien vers un post). Bref donc mon petit bout de code est en fait un programme DOS qui cree une disquette de boot, qui ouvre le fichier .exe et qui copie par block de 512octet celui-ci en passant l'entete PSP qui ne sert pas dans ce cas. Le truc c'est que j'ai fait mon .exe en assembleur et que maintenant j'essai de la faire en C.

    Mat M. Quand tu dit
    En fait la logique semble somme toute simple : le segment de données est à la suite du segment de code, les instructions le "savent" lors de la compilation du programme.
    Comment elles le savent ? Je veux dire quand on part de rien il faut bien préciser quelque par l'adresse de debut du segment de données ?

    Si j'ai bien compris, avant d'appeler la procedure (CALL 0X2AC) qui correspond a ma procedure print en C, il fait un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    00000206  B80600            mov ax,0x6
    00000209  50                push ax
    Donc il "pousse" 0x6 dans la pile.
    Arrive en 0x2AC, il fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    000002AC  55                push bp
    000002AD  8BEC              mov bp,sp
    000002AF  83EC06            sub sp,byte +0x6
    A ce moment, je pense que si ma pile se situe par exemple en 0x200A, j'aurais:

    0x200A - 0x2009 -> Valeur de AX sauvé par le push AX ( 1er push )
    0x2008 - 0x2007 -> Valeur de l'adresse de retour de la procedure ( CALL )
    0x2006 - 0x2005 -> Valeur de BP sauvé par le push bp ( 2eme push )

    Ensuite on fait mov bp, sp, donc BP pointe sur 0x2005.
    AX, qui je pense correspond a l'adresse de debut de ma chaine "toto", devrait se trouver a BP+4. Mais dans le code, il fait un sub sp,byte +0x6, ce qui fait que BP doit pointer sur 0x200B et non sur 0x2009 (à moins que j'ai oublié un push quelque part).

    Dans le PSP on trouve donc l'adresse de fin du programme (00000002 5B 15B->Number of bytes in last 512-byte page of executable 200+15B =35B (code finit a 35A )), mais pas d'info sur le debut du segment de data.

    Je vais continuer a chercher, j'ai du faire l'impasse sur quelques chose.

    Merci encore !

  11. #11
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 360
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 360
    Points : 20 378
    Points
    20 378
    Par défaut
    Comment elles le savent ? Je veux dire quand on part de rien il faut bien préciser quelque par l'adresse de debut du segment de données ?
    C'est le compilateur ou l'assembleur qui "connait" tout.
    Donc il calcule les décalages et positionnement nécessaires.
    Par exemple en C si tu déclares une variable genre int i
    * le compilo ne va pas écrire dans les binaires "int i"
    * mais dans sa table des variables et symboles il sait que i est une variable, donc si dans le code on fait appel à i , à la place le compilo fourni l'adresse de i soit selon un décalage à partir du segment de données soit selon une adresse absolue.
    Pour le segment de données en fait le plus simple c'est de le placer derrière le segment de code tout bêtement.
    Connaissant la longueur du segment de code et la longueur totale du programme on obtient celle du segment de données adresse de début et de la fin.
    Soit adresse de fin : taille totale du programme.
    Adresse de début : adresse de fin - taille du segment de données

  12. #12
    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 Longueur du segment de code
    Bonjour,

    Si j'ai bien suivi, le PSP m'indique la longueur total du programme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    00000002 5B 15B->Number of bytes in last 512-byte page of executable 200+15B =35B (code finit a 35A )
    Mais ou trouver la longueur du segment de code ? Je connais son adresse mais pas sa longueur.

    Donc j'ai bien mon compilo qui me trouve l'offset de "toto"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    00000206  B80600            mov ax,0x6
    Il ne me manque que le segment de donnée pour fixer DS.

    Petite autre question, si je peux connaitre aussi la longueur de DS, je peux mettre ma pile juste apres (SS) ? Ou comme DOS, ou plus exactement le mode reel n'est pas multitache, je peux fixer mon segment de pile n'importe ou ? Genre a la fin en 0xffff.

    Merci pour les reponses :o)

  13. #13
    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 Trouvé :o)
    Bonjour,

    Je viens de voir un truc interessant, si je decompile avec TCC -S j'obtient a la fin :

    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
    ...
    TESTPROG_TEXT	ends
    _DATA	segment word public 'DATA'
    s@	label	byte
    	db	'toto'
    	db	0
    _DATA	ends
    TESTPROG_TEXT	segment byte public 'CODE'
    TESTPROG_TEXT	ends
    	public	_init_log
    	public	_log
    	public	_print
    	public	_nb2car
    	public	_inp
    	public	_pause
    	public	_outp
    	public	_dump
    	public	_main
    	public	_clrscr
    	public	_logHex
    	end
    A la fin on voit qu'il y a un label _DATA au debut de me zone de données, donc j'ai ajouté au debut de mon programme C:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    asm {
       mov AX, _DATA
       mov DS, AX
    }
    Et il me remplace bien _DATA par le segment de donnée !
    Note: Je compile avec Turbo C de borland.

    Merci pour vos reponses !

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 05/08/2010, 09h52
  2. Calculer l'adresse réelle à partir de segment:offset
    Par jacko842 dans le forum x86 16-bits
    Réponses: 5
    Dernier message: 22/11/2009, 20h06
  3. [OCILIB] Adresse IP du serveur base de données
    Par Abdelkaoui dans le forum Interfaces de programmation
    Réponses: 29
    Dernier message: 07/03/2008, 08h29
  4. [TPW] Segment de données trop volumineux
    Par petit programmeur dans le forum Turbo Pascal
    Réponses: 9
    Dernier message: 26/02/2008, 22h22
  5. GDT Descripteur de segment de code & segment de données
    Par Edouard Kaiser dans le forum x86 32-bits / 64-bits
    Réponses: 15
    Dernier message: 03/04/2004, 12h40

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