Bonjour,
Deux erreurs (au moins) apparaissent dans ton code. Les voici :
- l'instruction aam fonctionne avec un paramètre qui est le diviseur ; dans mon code il faut préciser la valeur
16(en décimal) ou
10h(hexa) qui a pour but de séparer l'octet à convertir en deux octets al et ah correspondant aux 4 bits de poids faible et fort. A la compilation tu auras deux opcodes, l'un pour aam (D4) et l'autre pour le diviseur. Avec Nasm si on ne précise pas le diviseur, le diviseur est fixé à 10(décimal) ou A(hexa) ce qui ne convient pas (les deux opcodes seraient D4 0A - alors qu'il te faut
D4 10).
- la routine de conversion hexa-ascii n'est à effectuer que lorsque le serial aura déjà été calculé (somme des octets). Elle sert à l'affichage du word qui sera obtenu.
Tu mettras l'octet de poids faible de ce word dans al avant d'appeler la routine (mettre ret si tu l'utilise en tant que sous programme) et tu sauvegarderas ax à l'emplacement chaine (al en chaine+2 et ah en chaine+4).
Tu recommences avec l'octet de poids fort de ton word (mettre dans al et appeler la routine) et sauvegarde au retour ax dans chaine (al dans chaine et ah dans chaine+1)
Au global ton word aura été converti en 4 octets correspondant aux 4 caractères ascii. Il suffira te terminer ta chaine par un octet zéro (dans chaine+4)
Voici ton code après quelques corrections
; Generation routine
lea esi, sName
lea edi, sSerial
mov ecx, eax ;je suppose que eax contient le nombre de caractères
mov word ptr[edi],0 ;initialisation à zéro
addition movzx ax, byte ptr [esi] ;convertit l'octet lu en un word
add word ptr[edi],ax ;le rajoute au serial en cours d'écriture
inc esi
loop addition,ecx ;effectue l'addition tant qu'il reste des caractères
mov al, byte ptr[edi] ;lit l'octet de poids faible du serial
call hexascii
mov offset [chaine+2],ax
inc edi
mov al, byte ptr[edi] ;lit l'octet de poids fort du serial
call hexascii
mov offset [chaine],ax
mov offset [chaine+4],byte 0 ;zero terminal
INVOKE SetDlgItemText, hWnd, IDC_SERIAL, ADDR chaine
hexascii:
aam 10h ;syntaxe NASM-quel est le message d'erreur de Masm ?
cmp al,9
jna num1 ; E est >9 (de A à F) il faut ajouter 7
add al,7 ; al contient alors 15h
num1: xchg al,ah ; permute al et ah
cmp al,9
jna num2
add al,7
num2 : add ax,3030h ; rajoute 30h à chacun des deux octets
ret
data?
chaine réserver 5 octets ; je ne me souviens pas de la syntaxe de Masm