"Error 155" Problème.. au secours :-)

"Error 155" Problème.. au secours :-) - ASM - Programmation

Marsh Posté le 05-05-2003 à 10:41:57    

Bonjour.
J'ai un probleme avec les sources dun logiciel. En fait je veux changer le type dune variable pour pouvoir lui affecter une valeur plus grande, mais j'ai un probleme.
 
Fichier de declaration de variables:

Code :
  1. sp_adt          : word;        { averaging }


 
Fichier avec code ASM:

Code :
  1. procedure get_spi;assembler;
  2. const qq = 100;
  3. var n,nn,mm,a,i,j,md,vv,ia,l,ii,bb,i0,zz,aa : integer; fb : byte;
  4. { In ax 0..N  }
  5. asm
  6.          mov     zz,  0ffffh
  7.          mov     a,      ax   ; call  get_pb
  8.          mov     ax,scan.sp_nx; mov   n, ax; mov nn, ax; mov mm, ax
  9.          push    sp_adt  ; pop   in_nmb
  10.          etc .....


 
Quand je declare sp_adt en DOUBLE par exemple, au niveau du push sp_adt il me met l'erreur suivant:

Code :
  1. Error 155: Invalid combinaison of opcode and operands.


 
Je ne connais pas torp l'assembleur, donc je ne sais pas comment resoudre ce probleme. Quelqu'un aurait une idée ?
 
ps: a la base c'est du pascal, mais la procedure ou il y a l'erreur est en asm donc j'ai prefere poster ma question ici.
 
ps2: je compile avec turbo pascal 7


Message édité par mesta le 05-05-2003 à 10:44:11
Reply

Marsh Posté le 05-05-2003 à 10:41:57   

Reply

Marsh Posté le 05-05-2003 à 10:45:43    

on peut faire push d'une variable ? :??: je croyais que ce n'était que pour les registres


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 05-05-2003 à 11:04:15    

Je ne sais pas... ca ne marche qu'avec WORD, j'ai essayé BYTE ou LONGINT ... et j'ai toujours la même erreur  :(  
 
Comment cela se fait-ce ?

Reply

Marsh Posté le 05-05-2003 à 11:18:54    

D'après ma bible, le PUSH est prévu de base pour les words et dwords, pas pour les bytes, SAUF si c'est un immédiat, donc un truc genre PUSH 255.  J'en ai déjà fait l'expérience, le PUSH ne prend pas de registre/variable 8 bits.
 
Il est tout à fait possible de faire un push sur une variable (mais pas 8 bits donc) et même sur les registres de segments (CS, DS, ES, FS, GS, SS).
 
Edit: ooops pas vu TP7.  Bon, ça doit être de l'ASM 8086 et là je suis pas sûr que les variables étaient acceptées.  Je dirais même que non.


Message édité par drasche le 05-05-2003 à 11:20:00

---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
Reply

Marsh Posté le 05-05-2003 à 11:20:19    

La syntaxe ne serait-elle pas ?
push dword sp_adt

Reply

Marsh Posté le 05-05-2003 à 11:25:09    

non, l'assembleur connaît la taille d'après le paramètre passé à PUSH.  Si on fait de l'adressage indirect, il sera sage de lui préciser le type de pointeur dans ce cas précis.


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
Reply

Marsh Posté le 05-05-2003 à 11:28:42    

Coment je peux faire alors ?
Le type WORD n'est pas assez grand... car je dois affecter une grosse valeur a sp_adt (au moins 1 000 000).

Reply

Marsh Posté le 05-05-2003 à 11:31:31    

ben le type dword [:spamafote]


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
Reply

Marsh Posté le 05-05-2003 à 11:33:49    

En fait, lors de la creation des variable c'est du pascal... donc dword n'est pas reconnu :/

Reply

Marsh Posté le 05-05-2003 à 11:38:27    

ben t'as quand meme bien un truc sur 32bits non ?

Reply

Marsh Posté le 05-05-2003 à 11:38:27   

Reply

Marsh Posté le 05-05-2003 à 11:40:45    

Comme type de variable il y a :  
 
1 octet (type SHORTINT ou BYTE), 2 octets (type INTEGER ou WORD) ou 4 octets (type LONGINT) alors qu'un réel est stocké sur 4 octets (type SINGLE), 6 octets (type REAL), 8 octets (type DOUBLE) ou 10 octets (type EXTENDED).
 
Il y en a un d'interessant lol ?

Reply

Marsh Posté le 05-05-2003 à 11:42:06    

ben longint ?

Reply

Marsh Posté le 05-05-2003 à 11:44:16    

Toujours la meme erreur ...  :(
 
Il n'y aurait pas moyen dans la procedure ASM de modifier qq chose .. mettre le contenu de sp_adt dans un registre ou je ne sais quoi ?


Message édité par mesta le 05-05-2003 à 11:53:24
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed