http://www.sillevl.be - blog http://www.sillevl.be/blog - flickr http://www.flickr.com/sillevl
Zoiets:
1
2
3
4
5
6
7
8
| __asm{
call i2c_get_ack
pop ax
cmp ax,0
jz einde
mov status,1
einde:
} |
[ Voor 1% gewijzigd door MTWZZ op 18-05-2005 12:09 . Reden: wel de goeie jump doen dus ]
Nu met Land Rover Series 3 en Defender 90
Testen tegen 0 kan overigens ook met test ax, ax, scheelt weer een paar bytes
[ Voor 66% gewijzigd door .oisyn op 18-05-2005 12:20 ]
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
dom van me, ik dacht dat ax nog gepopt moest worden niet dus....
bedankt
http://www.sillevl.be - blog http://www.sillevl.be/blog - flickr http://www.flickr.com/sillevl
Mijn probleem is het volgende.
ik wil een C functie oproepen vanuit ASM, maar ik vind het niet hoe ik mijn parameters moet doorgeven.
Ik dacht dat het via de stack moet, maar in welke volgorde of zo weet ik niet.
vb:
1
| void test(int a,int b); |
wordt dit dan iets in de aard van:
1
2
3
| push a push b call test |
wil niet echt lukken bij mij
http://www.sillevl.be - blog http://www.sillevl.be/blog - flickr http://www.flickr.com/sillevl
.edit: om een antwoord te geven op je vraag: over het algemeen moet je de parameters in de omgekeerde volgorde op de stack pushen. Ook niet vergeten de gereserveerde ruimte op de stack na de functioncall weer vrij te geven met een add sp, 4 (die 4 is omdat je 2 16 bit integers pusht, dus 4 bytes in totaal)
.edit2: in de nasm docs zijn de verschillende calling conventions gedocumenteerd. Je kunt het betreffende hoofdstuk hier vinden.
[ Voor 74% gewijzigd door .oisyn op 18-05-2005 16:02 ]
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
1
2
3
4
5
| push dword [ebp+12] ;argv by value push dword app_version push dword [ebp+8] ;argc by value push dword app_id call gnome_init |
gnome_init is zoiets:
1
| gnome_init(const char *app_id, const char *app_version, int argc, char **argv) |
Nu met Land Rover Series 3 en Defender 90
bedankt.oisyn schreef op woensdag 18 mei 2005 @ 13:37:
Het is wat handiger als je dezelfde soort vragen in eenzelfde topic houdt. Ik heb je topicstart van je nieuwe topic even verplaatst naar deze.
Ik wil nog even vermelden dat ik inline asm in visual studio dot net gebruik..edit: om een antwoord te geven op je vraag: over het algemeen moet je de parameters in de omgekeerde volgorde op de stack pushen. Ook niet vergeten de gereserveerde ruimte op de stack na de functioncall weer vrij te geven met een [i]add sp, 4[/'] (die 4 is omdat je 2 16 bit integers pusht, dus 4 bytes in totaal)
.edit2: in de nasm docs zijn de verschillende calling conventions gedocumenteerd. Je kunt het betreffende hoofdstuk hier vinden.
die add sp,4 is niet nodig dacht ik, ik dacht dat de function call van C voor de stack zorgde... (ik kan mis zijn ook hoor)
het probleem is dat ik steeds een error krijg wanneer ik een push uitvoer.
er komt op dat ik de ESP niet goed opgeslagen heb voor de functie call, ik heb deze ook al proberen pushen maar dat geeft geen effect.
de functie die ik wil uitvoeren kan ik niet meer bewerken of zo
uit die gnome code ben ik ook niet wijzer uit geraakt
http://www.sillevl.be - blog http://www.sillevl.be/blog - flickr http://www.flickr.com/sillevl
Sommige mensen kunnen niet kopieren. Het is dus:MTWZZ schreef op woensdag 18 mei 2005 @ 13:41:
hier doen ze het zo om gnome_init aan te roepen:
GAS:
1 2 3 4 5 push dword [ebp+12] ;argv by value push dword app_version push dword [ebp+8] ;argc by value push dword app_id call gnome_init
gnome_init is zoiets:
C:
1 gnome_init(const char *app_id, const char *app_version, int argc, char **argv)
1
2
3
4
5
6
7
| ; gnome_init
push dword [ebp+12] ;argv by value
push dword [ebp+8] ;argc by value
push dword app_version
push dword app_id
call gnome_init
add esp, 16 ; to clean the stack: add esp, (# args * 4) |
int is 32 hier bits. Je ziet mooi dat de volgerde omgedraaid is en dat de ruimte voor argumenten na de call weer vrijgemaakt wordt (Zoals .oisyn al zei).
[ Voor 3% gewijzigd door Daos op 18-05-2005 16:13 ]
Dat is dus niet zoLittleWan schreef op woensdag 18 mei 2005 @ 16:01:
die add sp,4 is niet nodig dacht ik, ik dacht dat de function call van C voor de stack zorgde... (ik kan mis zijn ook hoor)
De standaard calling convention voor C++ non-vararg functies is dat zij idd wel hun stack opruimen, ouderwetse C functies en functies met een variabel aantal parameters (de "..." notatie) ruimen hun stack niet op. Voor die laatste groep functies kan dat ook niet; de functie weet immers niet hoeveel parameters er daadwerkelijk op de stack gezet zijn, dus hij kan ze ook niet opruimen.
Waarschijnlijk is je stack stuk, kans is groot dat dat komt omdat je de stack vergeten bent op te ruimenhet probleem is dat ik steeds een error krijg wanneer ik een push uitvoer.
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
Ah ja ! int is 32, dus ik moet er 4 per int adden !!!
in .oisyn zijn quote stond dat een int 2 bytes was
ik moet dringend eens beginnen onthouden hoeveel bytes een int is
mooi mooi, ik ben blij dat jullie mij geholpen hebben, ik heb er zeker en vast weer wat over geleerd...
[ Voor 13% gewijzigd door LittleWan op 18-05-2005 16:12 ]
http://www.sillevl.be - blog http://www.sillevl.be/blog - flickr http://www.flickr.com/sillevl
Duh, jij zat te kloten met ax, niet met eax. Dat is een 16 bits registerLittleWan schreef op woensdag 18 mei 2005 @ 16:10:
in .oisyn zijn quote stond dat een int 2 bytes wasdaar zat het probleem dus !
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
die ax was van mijn vorige topic, ik had nl 2 topics in dit forum lopen over bijna het zelfde, en de mods hebben die samen smeten naar 1 topci.oisyn schreef op woensdag 18 mei 2005 @ 16:25:
[...]
Duh, jij zat te kloten met ax, niet met eax. Dat is een 16 bits register
http://www.sillevl.be - blog http://www.sillevl.be/blog - flickr http://www.flickr.com/sillevl
Ach de argumenten waren een beetje anders van de gnome_init die ik vond
Zo'n ASM guru ben ik nou ook weer niet.
Nu met Land Rover Series 3 en Defender 90