[C->ASM] C functies gebruiken vanuit ASM

Pagina: 1
Acties:

  • LittleWan
  • Registratie: Februari 2003
  • Laatst online: 13-03 18:21
beste, ik heb een klein programmatje geschreven in C met in line asm, nu ben ik bezig zo veel mogelijk om te zetten naar asm.
Ik probeer hier het volgende maar het weigert te werken. het programma opent gewoon niet meer.
code:
1
2
3
if(i2c_get_ack()){
    status = 1;
}

probeer ik om te zetten naar
code:
1
2
3
4
5
6
7
8
    __asm{
        call    i2c_get_ack
        pop     ax
        bt      ax,0
        jz      einde
        mov     status,1
        einde:
    }

wat zou ik hier kunnen misdoen??

http://www.sillevl.be - blog http://www.sillevl.be/blog - flickr http://www.flickr.com/sillevl


  • MTWZZ
  • Registratie: Mei 2000
  • Laatst online: 13-08-2021

MTWZZ

One life, live it!

Misschien met cmp?
Zoiets:
code:
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


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21:12

.oisyn

Moderator Devschuur®

Demotivational Speaker

waarom pop je ax? Meestal wordt de returnvalue vanuit de functie zelf in ax gezet, niet op de stack (is ook wat lastig aangezien het returnadres al op de stack staat, de returnvalue er ook opzetten zou betekenen dat je eerst het returnadress moet poppen, en vervolgens resp. de returnvalue pushen en het returnadres opnieuw pushen)

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.


  • LittleWan
  • Registratie: Februari 2003
  • Laatst online: 13-03 18:21
idd, het werkt :d
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


  • LittleWan
  • Registratie: Februari 2003
  • Laatst online: 13-03 18:21
Ik vind hier bitterweinig over op internet en geraak er niet aan uit, zelfs in mijn boeken die ik hier liggen heb staat het niet deftig uitgelegd.
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:
code:
1
void test(int a,int b);


wordt dit dan iets in de aard van:
code:
1
2
3
push a
push b
call test


wil niet echt lukken bij mij :s

http://www.sillevl.be - blog http://www.sillevl.be/blog - flickr http://www.flickr.com/sillevl


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21:12

.oisyn

Moderator Devschuur®

Demotivational Speaker

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.

.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.


  • MTWZZ
  • Registratie: Mei 2000
  • Laatst online: 13-08-2021

MTWZZ

One life, live it!

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)

Nu met Land Rover Series 3 en Defender 90


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 02-05 01:32
En denk aan wat .oisyn zegt: de caller is normaalgesproken verantwoordelijk om de op de stack gealloceerde variabelen weer vrij te geven. Je hebt daar dus nog een extra add sp, 16 bij nodig.

  • LittleWan
  • Registratie: Februari 2003
  • Laatst online: 13-03 18:21
.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.
bedankt :)
.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.
Ik wil nog even vermelden dat ik inline asm in visual studio dot net gebruik.
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 :s

http://www.sillevl.be - blog http://www.sillevl.be/blog - flickr http://www.flickr.com/sillevl


  • Daos
  • Registratie: Oktober 2004
  • Niet online
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)
Sommige mensen kunnen niet kopieren. Het is dus:
code:
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 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21:12

.oisyn

Moderator Devschuur®

Demotivational Speaker

LittleWan 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)
Dat is dus niet zo :)
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.
het probleem is dat ik steeds een error krijg wanneer ik een push uitvoer.
Waarschijnlijk is je stack stuk, kans is groot dat dat komt omdat je de stack vergeten bent op te ruimen :). En esp pushen heeft natuurlijk niet zoveel nut he, die zet de waarde van esp op de stack, de pointer naar die stack is esp zelf, als je esp dus verandert kun je 'm ook niet meer terughalen ;)

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.


  • LittleWan
  • Registratie: Februari 2003
  • Laatst online: 13-03 18:21
Ah ja ! int is 32, dus ik moet er 4 per int adden !!!
in .oisyn zijn quote stond dat een int 2 bytes was :s daar zat het probleem dus !
offtopic:
ik moet dringend eens beginnen onthouden hoeveel bytes een int is :s


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


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21:12

.oisyn

Moderator Devschuur®

Demotivational Speaker

LittleWan schreef op woensdag 18 mei 2005 @ 16:10:
in .oisyn zijn quote stond dat een int 2 bytes was :s daar zat het probleem dus !
Duh, jij zat te kloten met ax, niet met eax. Dat is een 16 bits register :)

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.


  • LittleWan
  • Registratie: Februari 2003
  • Laatst online: 13-03 18:21
.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 :)
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 :D

http://www.sillevl.be - blog http://www.sillevl.be/blog - flickr http://www.flickr.com/sillevl


  • MTWZZ
  • Registratie: Mei 2000
  • Laatst online: 13-08-2021

MTWZZ

One life, live it!

Daos schreef op woensdag 18 mei 2005 @ 16:03:
[...]

Sommige mensen kunnen niet kopieren.
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

Pagina: 1