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