Dump hexadecimal

Description

permet de faire des fichier de resources
plus pratique qu'un fichier *.rc ou il faut utiliser plusieurs appi pour recuperer
l'offset de la resource c'est un prog qui utilise que ds fonctions dos
j'avais fait le même prog avec des apis grande difference de vitesse

LINK version 5.60.339

Source / Exemple :

.386
code16  segment use16
        assume cs:code16,ds:code16



octets          db      20 dup(0)
buffer          db      100 dup(0)
format          db      '0123456789ABCDEF',0
hf_cible        dw      ?
hf_source       dw      ?
nbwrite         dw      ?
sizefile        dd      0
nbread          dd      0
path_fc         db      100 dup(0)
fn_source       db      100 dup(0)
label_name      db      12 dup(0)
text1           db      9h,'Ajout dans un fichier de resource *.hex d'
                db      82h,'j',85h,20h,82h,'xistant ?',0Dh,0Ah
                db      9h,'si oui : chemin + nom de fichier + [ENTER],sinon :'
                db      '[ENTER]',0Dh,0Ah,'$'
text3           db      0Dh,0Ah,9h,'Donnez un nom pour le label et validez' 
                db      '[ENTER]',13,10,9,'nom :','$'
usage           db      0Dh,0Ah,9h,'Faites glisser sur l',27h,'executable le' 
                db      'fichier que vous voulez'
                db      0Dh,0Ah,9h,'utiliser comme resource dans un programme.','$'

start16:
        ;pour lire la ligne de commande  ds=es
        ;pour lire les données ds=cs

        push     cs
        pop      ds

        cmp  byte ptr es:[80h],0
        je   @usage

;------------------------------------ouverture du fichier source-------------------------------

         mov     bl,es:[80h]
         xor     bh,bh                           ;bx=longueur ligne de command

         mov     byte ptr es:[81h+bx],0          ;la chaine doit ce terminer par 0
         
         mov   ax,3d02h                          ;ouvre fichier source
         push  es
         pop   ds
         mov   dx,82h
	   int   21h
         push  cs
         pop   ds
	   mov   hf_source,ax                      ;handle
         
         

         mov    ax,4202h                         ;optenir la taille du fichier source
         mov    bx,hf_source
         xor    cx,cx
         xor    dx,dx
         int    21h
         mov    bx,dx
         shl    ebx,16
         mov    bx,ax
         mov    sizefile,ebx

         mov    ax,4200h                       ;remettre le pointeur au début du fichier source
         mov    bx,hf_source
         xor    cx,cx
         xor    dx,dx
         int    21h


;---------------------demande à l'utilisateur si  ajout ou nouveau-------------
        mov     ah,9h
        mov     dx,offset text1
        int     21h
        

        mov      byte ptr [path_fc],98               ;indique la taille max du buff avant appelle
                                                     ;fonction.   
        xor      ax,ax
        mov      ah,0Ah
        mov      dx,offset path_fc              
        int      21h                                 ;ecriture ds buff

        mov     bl,[path_fc+1]
        cmp     bl,0                                 ;faut-il creer un nouveau fichier ?           
        je      newfile

        add     bl,2
        mov     byte ptr [path_fc+bx],0
        
      
      
        
         mov   ax,3d02h                              ;ouvre fichier cible
         push  cs
         pop   ds
         lea   dx,[path_fc+2]
	   int   21h
         mov   hf_cible,ax                           ;handle
         
         mov    ax,4202h                             ;mettre le pointeur à la fin du fichier
         mov    bx,hf_cible
         xor    cx,cx
         xor    dx,dx
         int    21h

         mov   ah,40h                                ;écris saut de ligne retour chariot
         mov   bx,hf_cible
   	   mov   cx,2
         mov   word ptr [buffer],0A0Dh
         lea   dx,[buffer]
	   int   21h

         jmp    appendfile
       

newfile:

;---------------------------------creation du fichier cible----------------------------------       

         mov     bl,es:[80h]
         xor     bh,bh                           ;bx=longueur ligne de command

         mov     cx,bx   
         mov     di,81h
         mov     al,'.'                          ;cherche '.'dans ligne de command  
         repne   scasb                 

         mov     dword ptr es:[di],00584548h     ;change l'extenssion en '.HEX' 
         

         mov     ah,3Ch                          ;cree le fichier *.hex
         xor     cx,cx
         push    es
         pop     ds
         mov     dx,82h
         int     21h
         push    cs
         pop     ds
         mov     hf_cible,ax                     ;handle

appendfile:
         
;----------------------------creer label data--------------------      
        mov     ah,9h
        mov     dx,offset text3
        int     21h

        mov      byte ptr [label_name],10          ;indique la taille max du buff avant appelle
                                                   ;fonction.   
        
        mov      ah,0Ah
        mov      dx,offset label_name              
        int      21h                               ;ecriture ds buff
        
        mov     bl,[label_name+1]              
        add     bx,2                              ;bx=taille chaine + 2 premiers octs du buffer
        mov     byte ptr [label_name+bx],20h      ;ajout d'un espace en fin de chaine

               


;--------------------LECTURE FICHIER SOURCE ECRITURE FICHIER CIBLE---------------------------


         xor   cx,cx
         mov   ah,40h
         mov   cl,[label_name+1]              ;nombre caractères tapé au clavier
         inc   cl                             ;+1 puisqu'ajout d'un espace
         lea   dx,[label_name+2]              ;addr chaine
         mov   bx,hf_cible
 	   int   21h                            ;ecriture du label_name dans fichier cible

    
                
 nextline:
        
        
        mov   ax,3F00h                        ;lit 16 octets ds fichier source
        mov   bx,hf_source
        mov   cx,16                    
        mov   dx,offset octets                ;les stoke dans octets       
        int   21h
        test  ax,ax                           ;fin de lecture du fichier ?   
        je    @4
;------------------------------determiner le nombre de bytes à ecrire.        
        push  ax
        add   nbread,eax
        mov   bx,5
        mov   edx,sizefile
        cmp   edx,nbread          ;est-ce que le nombre total d'octets lu = taille fichier ? 
        jne     @1
        
        mov    bx,3
        
@1:                
        
       
        mov   cx,ax                  
        shl   ax,2
        add   ax,cx                              ;mult par 5 le nbr d'octets  
        add   ax,bx                              ;et add bx

        mov   nbwrite,ax                         ;nbr d'octets à écrire
;-------------------------------        
              
        lea   di,[buffer]                        
        lea   bx,[octets]
        
        mov   dword ptr [di],20206264h          ;'db  '
        add   di,4

       
        
        pop   cx
        
       
   formatage:
        mov   byte ptr [di],30h                  ;'0'
        call  FormatByte
        mov   word ptr [di],2C68h                ;'h,'
        add   di,2
        loop  formatage
        
        dec   di                                 ;pas ecrire virgule si fin de ligne
        
        mov   word ptr  [di],0A0Dh               ;saut de ligne retour chariot
        
        mov   ah,40h                             ;écris ligne ds fichier cible
        mov   bx,hf_cible
 	  mov   cx,nbwrite
	  mov   dx,offset buffer
	  int   21h

        jmp   nextline

@usage:
        
        mov     ah,9h
        mov     dx,offset usage
        int     21h
        mov   ah, 00h                 
        int   16h

        jmp     @5

@4: 
        mov     ah,3Eh                          ;fermer handle
        mov     bx,hf_cible
        int     21h
@5:      

        mov     ax,4C00h                        ;quit
        int     21h
         
 Formatbyte proc
 
        xor   ax,ax
        xor   dx,dx
        mov   si,offset format
        mov   al,[bx]
        inc   bx
        mov   dl,al
        shr   al,4
        and   dl,00001111b
        push  si
        add   si,ax
        mov   al,[si]
        inc   di
        mov   [di],al
        pop   si
        add   si,dx
        mov   al,[si]
        inc   di
        mov   [di],al
        inc   di
        ret
        
Formatbyte endp                    
        
code16  ends                           

; ---------------------------------------------------------------------------
; SEGMENT DE STACK

stack16 segment stack
        db      200h dup (?)
stack16 ends

        end start16

Conclusion :

pour compiler vous devez avoir le LINK version 5.60.339
vous avez qu'à taper LINK version 5.60.339 dans un moteur de recherche
je l'ai renommer link16 et je l'ai mis dans le repertoire masm32/bin

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.