int main%28void%29%3Cbr %2F%3E%7B%3Cbr %2F%3E unsigned int R1 %3D 11%2C R2 %3D 40%2C R3 %3D 0xfffffff%3B%3Cbr %2F%3E unsigned long long int summa%3B%3Cbr %2F%3E%3Cbr %2F%3E __asm__ __volatile__%28%3Cbr %2F%3E %26quot%3B push EDI %3B%5Cn%5Ct%26quot%3B%3Cbr %2F%3E %26quot%3B xor edi%2Cedi %3B%5Cn%5Ct%26quot%3B%3Cbr %2F%3E%09%09 %26quot%3Baddl %25%EDx%2C%25%EAx %3B%5Cn%5Ct%26quot%3B%3Cbr %2F%3E%09%09 %26quot%3Badcl 0%2C%25%EDi %3B%5Cn%5Ct%26quot%3B%3Cbr %2F%3E%3Cbr %2F%3E%09%09 %26quot%3Baddl %25%ECx%2C%25%EAx %3B%5Cn%5Ct%26quot%3B%3Cbr %2F%3E%09%09 %26quot%3Badcl 0%2C%25%EDi %3B%5Cn%5Ct%26quot%3B%3Cbr %2F%3E%3Cbr %2F%3E%09%09 %26quot%3Bmovl %25%EDi%2C%25%EDx %3B%5Cn%5Ct%26quot%3B%3Cbr %2F%3E%09%09 %2F%2F EDX%3AEAX %3D summa%28eax%2C edx%2C ecx%29%3Cbr %2F%3E%3Cbr %2F%3E %26quot%3B pop EDI %3B%5Cn%5Ct%26quot%3B%3Cbr %2F%3E %26quot%3B mov 1%2C %25%25ESI %3B%5Cn%5Ct%26quot%3B%3Cbr %2F%3E%3Cbr %2F%3E %3A%26quot%3B%3Da%26quot%3B%28summa%29%3Cbr %2F%3E %3A%26quot%3Ba%26quot%3B%28R1%29%2C %26quot%3Bd%26quot%3B%28R2%29%2C %26quot%3Bc%26quot%3B%28R3%29%3Cbr %2F%3E %3A %26quot%3B%25%25ESI%26quot%3B %2F%2F clobber list.%3Cbr %2F%3E %29%3B%3Cbr %2F%3E printf%28%26quot%3BSumma on%3D%25I64u%5Cn%5Ct%26quot%3B%2C summa%29%3B %2F%2F OS%3A Windows%2C 32-Bit. Linuxissa%3A %25llu.%3Cbr %2F%3E return 0%3B%3Cbr %2F%3E%7D%3Cbr %2F%3E%3Cbr %2F%3EToimiiko yll%C3%A4oleva oikein%3F%3Cbr %2F%3E%3Cbr %2F%3ESen olisi tarkoitus laskea 64 -bittinen summa kolmesta 32-bittisest%C3%A4 luvusta%3A%3Cbr %2F%3E%3Cbr %2F%3Esama kuin summa %3D R1 %2B R2 %2B R3%2C%3Cbr %2F%3E%3Cbr %2F%3Emutta siten%2C ett%C3%A4 tuloksen ei sallita %26quot%3Bpy%C3%B6r%C3%A4ht%C3%A4%C3%A4 ymp%C3%A4ri%26quot%3B KUN 32 -BITTINEN LUKUALUE Ylittyy.%3Cbr %2F%3E%3Cbr %2F%3ETarkoitus siis olisi ett%C3%A4 gcc -k%C3%A4%C3%A4nt%C3%A4j%C3%A4 huolehtii siit%C3%A4%2C ett%C3%A4%3A%3Cbr %2F%3E%3Cbr %2F%3Ev%C3%A4litt%C3%B6m%C3%A4sti ennen asm -lohkon alkua%3A%3Cbr %2F%3E%3Cbr %2F%3Emuuttuja R1 ladataan rekisteriin EAX.%3Cbr %2F%3Emuuttuja R2 ladataan rekisteriin EDX.%3Cbr %2F%3Emuuttuja R3 ladataan rekisteriin EDX.%3Cbr %2F%3E%3Cbr %2F%3Eja juuri asm -lohkon j%C3%A4lkeen%3A%3Cbr %2F%3E%3Cbr %2F%3Erekisteriparin EDX%3AEAX sis%C3%A4lt%C3%B6 tallennetaan muuttujaan summa.%3Cbr %2F%3E%3Cbr %2F%3EJa ihan testitarkoituksessa%3A%3Cbr %2F%3EKerrotaan C -k%C3%A4%C3%A4nt%C3%A4j%C3%A4lle%2C ett%C3%A4 asm -lohko k%C3%A4ytt%C3%A4%C3%A4 rekisteri%C3%A4 ESI eik%C3%A4 vaivaudu palauttamaan sen arvoa alkuper%C3%A4iseksi.%3Cbr %2F%3E%3Cbr %2F%3EToimiiko koodi tarkoitetulla tavalla%3F%3Cbr %2F%3E%3Cbr %2F%3EEnt%C3%A4%2C mit%C3%A4 pit%C3%A4isi muuttaa%2C jotta assembly -koodin voisi kirjoittaa intel -syntaksilla tuon at%26amp%3Bt sijasta %3F
assemblykoodi gcc:ssä (Windows; 32-bit)
2
137
Vastaukset
- asm_C_opiskelija
int main(void)
{
unsigned int R1 = 11, R2 = 40, R3 = 0xfffffff;
unsigned long long int summa;
__asm__ __volatile__(
" push EDI ;\n\t"
" xor edi,edi ;\n\t"
"addl @@edx,@@eax ;\n\t"
"adcl 0,@@edi ;\n\t"
"addl @@ecx,@@eax ;\n\t"
"adcl 0,@@edi ;\n\t"
"movl @@edi,@@edx ;\n\t"
// EDX:EAX = summa(eax, edx, ecx)
" pop EDI ;\n\t"
" mov 1, @@ESI ;\n\t"
:"=a"(summa)
:"a"(R1), "d"(R2), "c"(R3)
: "@@ESI" // clobber list.
);
printf("Summa on=@I64u\n\t", summa); // OS: Windows, 32-Bit. Linuxissa: @llu.
return 0;
}
VALITETTAVASTI suomi24 -forumohjelmisto sekoilee jälleen !
Alkuperäisessä viestissä C -lähdekoodissa olleet prosenttimerkit (jotka ikävä kyllä kuuluvat at&t syntaksiin assemblykielessä) aiheuttivat koko viestin sotkeutumisen.
Tässä sama viesti uudelleen siten, että jokainen prosenttimerkki on korvattu ät -merkillä. - hyväjostoimii
Ensinnäkin miksi laitat push-komennolla tuon EDI-rekisterin pinoon jota et käytä lainkaan?
Aivan joo mutta ei kannattaisi indeksirekistereitä, hitaampia käyttää tuolla tavoin, olisit käyttänyt laskennassa rekisteriä EEAX.
Ketjusta on poistettu 0 sääntöjenvastaista viestiä.
Luetuimmat keskustelut
- 712328
Jotain puuttuu
Kun en sinua näe. Et ehkä arvaisi, mutta olen arka kuin alaston koivu lehtiä vailla, talven jäljiltä, kun ajattelen sinu1012113- 781728
Hei A, osaatko
sanoa, miksi olet ihan yhtäkkiä ilmestynyt kaveriehdotuksiini Facebookissa? Mitähän kaikkea Facebook tietää mitä minä en421537- 781536
- 101467
- 311429
Persuilla ja Saksi-Riikalla meni sitten pornon levittämiseksi koko touhu.
Onko kenellekään yllätys?521298Synnittömänä syntyminen
Helluntailaisperäisillä lahkoilla on Raamatunvastainen harhausko että ihminen syntyy synnittömänä.731254Mitä tämä tarkoittaa,
että näkyy vain viimevuotisia? Kirjoitin muutama tunti sitten viestin, onko se häipynyt avaruuteen?301209