Assembler i C/C++

Här diskuteras programmering och utveckling
MiSTer
Inlägg: 29
Blev medlem: 17 aug 2007, 02:32

Assembler i C/C++

Inlägg av MiSTer »

Snubblade över en fråga om hur man anropar en funktion skriven i assembler inuti ett C program...
Och inte då "inline assembler" tex; asm("movl %ecx %eax");

Utan mer:

Kod: Markera allt

main()
{
    rutin(blabla, blablabla);
}
rutin.asm:

Kod: Markera allt

 section .data

 section .text
     global _start

 _syscall:
     int  0x80
     ret

 _start:
     mov  eax, 0x1
     call _syscall
Jag har bara tagit två "Hello World" exempel... så jag antar att viss ändring av Koden krävs för att den skall passa assemblern/länkaren...
Är det nån som vet hur man gör?
Om det nu går överhuvudtaget?
Användarvisningsbild
Osprey
Inlägg: 6310
Blev medlem: 06 apr 2008, 00:09
OS: Ubuntu
Ort: Göteborg/Mölndal/Falkenberg
Kontakt:

Re: Assembler i C/C++

Inlägg av Osprey »

Det ska inte vara några problem alls, det enda du behöver tänka på är att parameteröverföringen inte alltid är likadan mellan olika språk. När du programmerar i C/C++ eller Assembler så är detta ganska enkelt, eftersom du kan föra över parametrar precis som du vill. Med andra ord, om du ska skicka ett heltal så kan du i C/C++ skicka det antingen som ett värde, eller du kan skicka adressen till det, eller du kan skicka adressen till en "descriptor", det gäller bara att veta vad Assemblerfunktionen förväntar sig...

Med andra ord, det är jättelätt och ska inte vara några problem alls, ta bara reda på hur Assemblerfunktionen vill ha argumenten och anropa den på det sättet från C/C++... :)
Agera genom att ta och behålla initiativet, ta de risker detta kräver...
http://www.enargo.com/it/
OpenVMS Shark - i Linux finns inte SYS$CMKRNL...
MiSTer
Inlägg: 29
Blev medlem: 17 aug 2007, 02:32

Re: Assembler i C/C++

Inlägg av MiSTer »

Jag hittade exempel på hur man skulle kunna göra...

Kod: Markera allt

//main.c
main()
{
	int i = sqr(11);
	printf("%d\n",i);
}

//sqr.s
.globl sqr
sqr:
	movl 4(%esp), %eax
	imull %eax, %eax
	ret
Eller vice versa:

Kod: Markera allt

//print.c
print(int i)
{
	printf("%d\n",i);
}

//main.s
.globl main
main:
	movl $123, %eax
	pushl %eax
	call print
	addl $4, %esp
	ret
Problemet jag har är att övertala kompillatorn och länkaren att knåda ihop detta...
För att förvärra det ytterligare så kör jag på en 64-bitars maskin...
Även om man inte behöver 64-bitars kåd så tror jag att det krävs lite extra för att generera 32-bits kåd på en 64-bits maskin...
Vapenhot hjälper tydligen inte på vare sig nasm, gcc eller ld...
Lars
Inlägg: 6191
Blev medlem: 14 jan 2007, 19:31
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Ort: Stockholm

Re: Assembler i C/C++

Inlägg av Lars »

Följande Makefil sköter om länkning o.s.v. automatiskt

Kod: Markera allt

main:  main.c sqr.s
Men jag får segmenteringsfel på min 64-bitarsmaskin. Googla efter "calling convention" för att ta reda på vilka argument som läggs på stacken o.s.v.
Lars
Inlägg: 6191
Blev medlem: 14 jan 2007, 19:31
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Ort: Stockholm

Re: Assembler i C/C++

Inlägg av Lars »

Den här koden fungerar på 64 bitar:

Kod: Markera allt

.text
.global sqr
sqr:
        pushq %rbp
        movq %rsp, %rbp
        movl %edi, -4(%rbp)
        movl -4(%rbp), %eax
        imull -4(%rbp), %eax
        leave
        ret
Tricket är att implementera koden i C först och sedan köra "gcc -S sqr.c" :)
MiSTer
Inlägg: 29
Blev medlem: 17 aug 2007, 02:32

Re: Assembler i C/C++

Inlägg av MiSTer »

Ingen som har ett "livsdugligt" exempel?
Med kåd och fungerande kompileringsrad?

Jag hittar då inget...
Användarvisningsbild
Osprey
Inlägg: 6310
Blev medlem: 06 apr 2008, 00:09
OS: Ubuntu
Ort: Göteborg/Mölndal/Falkenberg
Kontakt:

Re: Assembler i C/C++

Inlägg av Osprey »

Jag hittade massor när jag sökte på "mixed c/c++ assembler in linux" på Google...
Agera genom att ta och behålla initiativet, ta de risker detta kräver...
http://www.enargo.com/it/
OpenVMS Shark - i Linux finns inte SYS$CMKRNL...
Lars
Inlägg: 6191
Blev medlem: 14 jan 2007, 19:31
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Ort: Stockholm

Re: Assembler i C/C++

Inlägg av Lars »

Fick du problem med min kod? Skapa en fil som heter "Makefile" men innehåll enligt ovan och kör sedan "make".
MiSTer
Inlägg: 29
Blev medlem: 17 aug 2007, 02:32

Re: Assembler i C/C++

Inlägg av MiSTer »

Jag hittar också massor när jag söker på det...
Tyvärr inget som hjälper...
MiSTer
Inlägg: 29
Blev medlem: 17 aug 2007, 02:32

Re: Assembler i C/C++

Inlägg av MiSTer »

Din asm funkade inte, Lars... :(
Användarvisningsbild
Osprey
Inlägg: 6310
Blev medlem: 06 apr 2008, 00:09
OS: Ubuntu
Ort: Göteborg/Mölndal/Falkenberg
Kontakt:

Re: Assembler i C/C++

Inlägg av Osprey »

Lite om anropen finns att läsa i "Calling conventions"...
Agera genom att ta och behålla initiativet, ta de risker detta kräver...
http://www.enargo.com/it/
OpenVMS Shark - i Linux finns inte SYS$CMKRNL...
Skriv svar

Återgå till "Programmering och webbdesign"