|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 | |
|
Bannato
Iscritto dal: Nov 2002
Città: PV
Messaggi: 1210
|
[ASM]Problema
Sto cercando di imparare l'asm x86 e ho provato questo codice:
Codice:
#include <iostream>
#include <cstdio>
using namespace std;
int Sum( int a, int b );
int main()
{
Sum(10, 30);
system( "PAUSE" );
return 0;
}
int Sum( int a, int b )
{
__asm
{
PUSH a;
PUSH b;
MOV EAXH, a;
MOV EAXL, b;
SUB a,b;
PUSH ris;
MOV EAX, ris;
POP ris;
}
}
Quote:
Tnk 1k Ultima modifica di Kleidemos : 31-08-2003 alle 10:45. |
|
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Oct 2001
Messaggi: 11471
|
non vorrei dire una cavolata ma in gcc l'inline assembly si usa cosi :
Codice:
__asm ( "push a\n" "push b\n" ... ); |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Sinceramente la sintassi dell'inline assembly del g++ non la conosco... Sicuramente avrà una sintassi AT&T...
[opcode][dimensione] [sorgente], [destinazione] MOVL %eax, $10 L sta per LONG: 32 bit W sta per WORD: 16 bit B sta per BYTE: 8 bit Ci vuole la % davanti ai registri e il $ davanti ai valori... In ogni caso questo è sbagliato: MOV EAXH, a; MOV EAXL, b; EAXH e EAXL non esistono !!! EAX 32 bit, AX 16 bit, AH 8 bit più sign. di AX, AL 8 bit meno sign. di AX... |
|
|
|
|
|
#4 |
|
Bannato
Iscritto dal: Nov 2002
Città: PV
Messaggi: 1210
|
ma AX non era AL (8 bit) + AH(8 ibt)??
E EAX nn era il corrispettivo a 32 bit? |
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Oct 2001
Messaggi: 11471
|
Quote:
cmq. se ti puo aiutare questo era lo schemino che mi ero fatto alle superiori: Codice:
31 EAX 0
+---------------------------------+
| | AX |
+---------------------------------+
15 AH | AL 0
7
|
|
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
Le parti raggiungibili sono i 32 bit interi con EAX, i 16 bit meno significativi di EAX con AX, gli 8 bit più significativi di AX con AH, gli 8 bit meno significativi di AX con AL... |
|
|
|
|
|
|
#7 |
|
Bannato
Iscritto dal: Nov 2002
Città: PV
Messaggi: 1210
|
che gnucco che sono.
Cmq è la 1° volta che mi avvicino all'asm |
|
|
|
|
|
#8 |
|
Bannato
Iscritto dal: Nov 2002
Città: PV
Messaggi: 1210
|
che gnucco che sono.
Cmq è la 1° volta che mi avvicino all'asm |
|
|
|
|
|
#9 | |
|
Bannato
Iscritto dal: Nov 2002
Città: PV
Messaggi: 1210
|
Codice:
#include <iostream>
#include <cstdio>
using namespace std;
int sum(int a, int b);
int main()
{
return 0;
}
int sum(int a, int b)
{
int res;
/*
L sta per LONG: 32 bit
W sta per WORD: 16 bit
B sta per BYTE: 8 bit
% davanti ai registri
$ davanti ai valori
*/
__asm
(
"pushw a" \
"mov ax, a" \
"pushw b" \
"mov bx, b" \
"add ax, bx" \
"mov ax, res" \
"popa res" \
);
return res;
}
Quote:
Ultima modifica di Kleidemos : 02-09-2003 alle 00:41. |
|
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Oct 2001
Messaggi: 11471
|
Quote:
allora: Codice:
__asm( "isrtuzione1 op1, op2 ; \n" "istruzione2 op2, op3 ; \n" ); inoltre per accedere ai registri devi farli precedere dal simbolo '%'. come ultimo alla fine hai inserito l'istruzione 'popa' ??? questa dove l'hai presa ciao |
|
|
|
|
|
|
#11 |
|
Bannato
Iscritto dal: Nov 2002
Città: PV
Messaggi: 1210
|
Codice:
int sum(int a, int b)
{
int res;
/*
L sta per LONG: 32 bit
W sta per WORD: 16 bit
B sta per BYTE: 8 bit
% davanti ai registri
$ davanti ai valori
*/
__asm
(
"pushw a ; \n" \
"mov ax, a ; \n" \
"pushw b ; \n" \
"mov bx, b ; \n" \
"add ax, bx ; \n" \
"mov ax, res ; \n" \
"pop res ; \n" \
);
return res;
}
Cmq ho seguito i consgli di cionci |
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Forse intendevi questo?
Codice:
int sum(int a, int b)
{
int res;
__asm __volatile__
(
"pushw %1 \n"
"movw %1, %%ax \n"
"pushw %2 \n"
"movw %2, %%bx \n"
"addw %%bx, %%ax \n"
"movw %%ax, %0 \n"
"popl %0"
: "=m"(res)
: "m"(a), "m"(b)
: "ax", "bx", "memory"
);
return res;
}
nb nota l'inversione degli operandi tra lo standard intel e at&t: mov ax, 1 => movw $1, %%ax
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
|
#13 |
|
Bannato
Iscritto dal: Nov 2002
Città: PV
Messaggi: 1210
|
Deve sommare 2 numeri.
mi spieghi questo codice tuo?? Codice:
: "=m"(res) : "m"(a), "m"(b) : "ax", "bx", "memory" |
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Così non sommi i due numeri, la pop finale ti sovrascrive res, e le push iniziali sono superflue. Puoi fare così (nota che int sono a 32 bit, non word a 16 bit):
Codice:
int sum(int a, int b)
{
int res;
__asm __volatile__
(
"addl %%ebx, %%eax"
: "=a"(res)
: "a"(a), "b"(b)
);
return res;
}
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
|
#15 |
|
Bannato
Iscritto dal: Nov 2002
Città: PV
Messaggi: 1210
|
si!
I 2 punti servono a ?? |
|
|
|
|
|
#16 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
La struttura generale di un blocco asm per il gcc è
Codice:
asm ( " blocco assembler" : elenco valori in uscita : elenco valori in ingresso : registri modificati ); "=x"(variabile) per i valori in uscita "x" (variabile) per i valori in ingresso dove 'x' è un parametro tra questi: r: registro, scelto dal compilatore tra quelli liberi m: memoria g: o registro o memoria, a scelta del compilatore a, b, c, d, S, D: registro eax, ebx, ecx, edx, esi, edi All'elenco dei valori accedi da dentro il codice con %<numero>, dove <numero> è la posizione (a partire da zero) del parametro nell'elenco. As es. se scrivi : "=m"(a) : "m"(b), "m"(c) 'a' sarà %0, 'b' %1, 'c' %2. Nota che nel mio esempio potevi anche scrivere addl %2, %1 oppure addl %2, %0 in quanto ho forzato la corrispondenza tra %0, %1 e eax e %2 e ebx.
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 19:59.


















