ecrire une routine assembleur dans un code source C - Programmation
Marsh Posté le 19-10-2001 à 16:45:53
heu, qu'est tu veux exactement ????
l'assembleur en ligne est différent dans chaque compilateur (borland/watcom/microsoft......)
Marsh Posté le 19-10-2001 à 16:58:33
heu, qu'est tu veux exactement ????
l'assembleur en ligne est différent dans chaque compilateur (borland/watcom/microsoft......)
c vrai, j'utilise à l'école BORLAND C++ 5.02 et g voudrais créer des routines graphique en assmbleur mais g ne connais pas la syntaxe k'il faut employer.
merci de me repondre....
Marsh Posté le 19-10-2001 à 17:05:36
un truc du style:
int yop(int zorg, int zirg)
{
int r;
__asm {
mov eax,zorg
xor eax,zirg
cmp eax,-1
jne yop
mov r,eax
jmp zlick
}
yop:
__asm {
dec eax
mov r,eax
}
zlick:
return r;
}
sous borland, c'est "asm" tout court, mais tu devais le savoir
qu'est ce tu veux, savoir interfaçer l'assembleur, ou connaitre les services du bios pour pouvoir faire mumuse ? tu parles du C++ sous DOS, ou du C++ builder sous windows ?
Marsh Posté le 19-10-2001 à 17:16:49
en fait g debute en c++, et g l'utilise sous windows mais le compilateur crée une fenetre DOS pour excuter le prog. je connais sinon bien l'assembleur et ses possibilités et j'aimerais tout simplement inclure du code.
la syntaxe du c me dit ke c
asm
{
...
}
mais ca marche pas quand je fais
asm
{
a db 10h
}
il me met unknow assembler instruction ?????
merci..
Marsh Posté le 19-10-2001 à 17:43:14
le db, tu n'as pas droit, les allocations de variables se font C, seul du code asm peut être déclaré...
char a=0x010;
asm {
mov al,a
}
idem, tout doit être en synthaxe C, donc:
asm mov al,0x0ff;
et pas
asm mov al,ffh;
attention aussi, toujours :
asm {
...
}
pas :
asm
{
...
}
les EQU passent pas, idem, fo #define, car même le code asm va passer par le préprocesseur........
Marsh Posté le 19-10-2001 à 17:59:08
GRAND MERCI MAITRE - TU M'EVITES QUELQUES HEURES PASSEES DEVANT L'ORDI...
aurais tu du code source comme exemple à m'envoyer stp ..
et pour les E/S command ca marche ?
et pour charger l'offset d'une variable ca doit etre
char a=0x010;
asm {
mov ax,[a]
}
non ?
Marsh Posté le 19-10-2001 à 18:25:48
sais plus !!!!!!!!!
je viens de faire des essais:
#include<stdio.h>
main()
{
int a=0x0AB;
int *b=&a;
int c,d;
__asm {
mov eax,[a]
mov ebx,b
mov c,eax
mov d,ebx
}
printf("%x, %x\n",c,d);
}
et là il ça me sort
ab, 12ff7c
donc non, le mov (e)ax,[a] ne te donne pos l'offset (logique même en asm pure), mais le compilateur (celui de visual studio), ne veut pas d'un:
mov eax, offset a
ou
mov eax,&a
là, je sais po, je me souviens que je contournais généralement le pb via un pointeur en amont en C, et je fesais surtout carrément des fonctions en ASM (dans .ASM), pis je liais le tout avec le C (pas d'asm en ligne pour mes routines critiques, tu perds du temps si le passage des paramètres et le retour créent des intructions à la con).......
Marsh Posté le 19-10-2001 à 19:13:02
slt,
j'ai rapidement récupé un vieux truc franchment je n'ai pas vérifié s'il marchait
void Rabit_Modulo_un(fft_code *val,tip x)
//-------------------------------------
// retourne le reste de (a*b)/modulo
// le signe est pris en compte
//------------------------------------
{
_EDX = *(val+x);
_EAX = *val;
asm push eax;
asm sub eax,edx;
asm sbb ecx,ecx;
asm and ecx,dword ptr [_MODUL];
asm add eax,ecx;
*(val+x) = _EAX;
// asm mov dword ptr [ebx+4*edi],eax;
asm pop eax;
asm mov ecx,dword ptr [_MODUL];
asm sub ecx,edx;
asm sub eax,ecx;
asm sbb ecx,ecx;
asm and ecx,dword ptr [_MODUL];
asm add eax,ecx;
*val= _EAX;
}
ecrit sous builder 3.0, parceque je crois que la version 5.02 a des problèmes avec les _EAX, ... (enfin registre 32 bits). Je sais plus, c'est loin ... pffff
c'est cencé correspondre au code ci-dessous mais la verison ASM est lourdement optimisé. les codes de test ont été judicieusement remplacés.
unsigned long a,
b;
a = *(val+x);
b = MODUL - a;
//-------- Cas : c = a - ret
if(a > *val)
*(val+x) = b + *val;
else
*(val+x) = *val - a;
//-------- Cas : c = a + ret
if(*val >= b)
*val -= b;
else
*val += a;
[edtdd]--Message édité par Barbarella--[/edtdd]
Marsh Posté le 20-10-2001 à 12:14:36
tien voila aussi du code que j'avais fait avec C++ Builder
Code :
|
Marsh Posté le 19-10-2001 à 16:02:11
la routine assembleur doit pouvoir gerer des variable avec les fonctions DB,DW.., les E/S, les interruptions du style
asm
{
int10 equ 10h
mov ax,13h
int int10
}