Interruption avec dev-cpp dans instruction asm()

mrtoufou Messages postés 7 Date d'inscription mercredi 18 juin 2003 Statut Membre Dernière intervention 5 septembre 2003 - 28 août 2003 à 17:07
mrtoufou Messages postés 7 Date d'inscription mercredi 18 juin 2003 Statut Membre Dernière intervention 5 septembre 2003 - 28 août 2003 à 20:41
J'ai un probleme avec dev-cpp. J'ai besoin de trouver la resolution avant d'acceder a la memoire video et je comptais pour cela utiliser la fonction vesa 4F03 de l'interruption 10.

Ma source compile mais lorsque je lance le prog je me tape un bon vieil ecran bleu windows 9x qui me dit que une erreur 0D et que l'application va se terminer.
De plus, j'ai essayé d'autres interruptions et j'ai eu a chaque fois des problemes a l'execution. J'ai ensuite compilé un code similaire en assembleur avec nasm et la pas de probleme.
J'ai cherché sur le site et j'ai trouvé un probleme similaire qui n'a pas non plus trouvé de réponse.
Voila le code :

#include "stdio.h"
#include "conio.h"
long int videoMod = 0;
long int codeErr = 0;
int main()
{
asm(
"pushl %eax\n"
"pushl %ebx\n"
"movl $0x00004F03, %eax\n"
"int $0x10\n"
"movl %eax, _codeErr\n"
"movl %ebx, _videoMod\n"
"popl %ebx\n"
"popl %eax"
);
switch(videoMod)
{
case 0x101: printf("640x480, 256 couleurs\n"); break;
case 0x110: printf("640x480, 32768 couleurs\n"); break;
case 0x111: printf("640x480, 65536 couleurs\n"); break;
case 0x112: printf("640x480, 16777216 couleurs\n"); break;
case 0x103: printf("800x600, 256 couleurs\n"); break;
case 0x113: printf("800x600, 32768 couleurs\n"); break;
case 0x114: printf("800x600, 65536 couleurs\n"); break;
case 0x115: printf("800x600, 16777216 couleurs\n"); break;
case 0x105: printf("1024x768, 256 couleurs\n"); break;
case 0x116: printf("1024x768, 32768 couleurs\n"); break;
case 0x117: printf("1024x768, 65536 couleurs\n"); break;
case 0x118: printf("1024x768, 16777216 couleurs\n"); break;
default: printf("mode inconnu: %x\nErreur: %x", videoMod, codeErr); break;
}
getch();
return 0;
}

Voila merci a tous ceux qui se pencherons sur le probleme.

2 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
28 août 2003 à 17:24
Dans dev-cpp les instructions sont a l'envers ???
"movl %eax, _codeErr\n"
"movl %ebx, _videoMod\n"

ce ne serait pas plutot:
mov _codeErr, eax
mov _videoMod, ebx

BruNews, ciao...
0
mrtoufou Messages postés 7 Date d'inscription mercredi 18 juin 2003 Statut Membre Dernière intervention 5 septembre 2003
28 août 2003 à 20:41
Salut BruNews,
Eh bien oui, c'est normal pour le code assembleur.
J'ai trouvé ca sur le site hier. Le compilateur par defaut de dev-cpp c'est gcc et il prend de instruction en assembleur AT&T et ca marche pas pareille. y a juste quelques regles de syntaxe qui changent. Voila les principales regles de syntaxe pour ceux qui seraient interressés en anglais parce que je veux pas me faire chier a traduire :
•	Register names are prefixed with %, so that registers are %eax, %dl and so on, instead of just eax, dl, etc. This makes it possible to include external C symbols directly in assembly source, without any risk of confusion, or any need for ugly underscore prefixes.
•	The order of operands is source(s) first, and destination last, as opposed to the Intel convention of destination first and sources last. Hence, what in Intel syntax is mov eax,edx (move contents of register edx into register eax) will be in GAS syntax mov %edx,%eax.
•	The operand size is specified as a suffix to the instruction name. The suffix is b for (8-bit) byte, w for (16-bit) word, and l for (32-bit) long. For instance, the correct syntax for the above instruction would have been movl %edx,%eax. However, gas does not require strict AT&T syntax, so the suffix is optional when size can be guessed from register operands, and else defaults to 32-bit (with a warning).
•	Immediate operands are marked with a $ prefix, as in addl $5,%eax (add immediate long value 5 to register %eax).
•	Missing operand prefix indicates that it is memory-contents; hence movl $foo,%eax puts the address of variable foo into register %eax, but movl foo,%eax puts the contents of variable foo into register %eax.
•	Indexing or indirection is done by enclosing the index register or indirection memory cell address in parentheses, as in testb $0x80,17(%ebp) (test the high bit of the byte value at offset 17 from the cell pointed to by %ebp).

De toute facon le probleme vient juste de l'instruction "int $0x10" parce que quand je la commente ca marche. Mais ca fait pas trop ce que je veux.
Merci de t'etre interressé a mon probleme BruNews. a plus
0
Rejoignez-nous