Sida 1 av 1

Assembler i C/C++

Postat: 22 feb 2009, 16:15
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?

Re: Assembler i C/C++

Postat: 22 feb 2009, 16:20
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++... :)

Re: Assembler i C/C++

Postat: 22 feb 2009, 16:32
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...

Re: Assembler i C/C++

Postat: 22 feb 2009, 16:42
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.

Re: Assembler i C/C++

Postat: 22 feb 2009, 16:53
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" :)

Re: Assembler i C/C++

Postat: 22 feb 2009, 20:16
av MiSTer
Ingen som har ett "livsdugligt" exempel?
Med kåd och fungerande kompileringsrad?

Jag hittar då inget...

Re: Assembler i C/C++

Postat: 22 feb 2009, 20:59
av Osprey
Jag hittade massor när jag sökte på "mixed c/c++ assembler in linux" på Google...

Re: Assembler i C/C++

Postat: 22 feb 2009, 22:08
av Lars
Fick du problem med min kod? Skapa en fil som heter "Makefile" men innehåll enligt ovan och kör sedan "make".

Re: Assembler i C/C++

Postat: 23 feb 2009, 00:36
av MiSTer
Jag hittar också massor när jag söker på det...
Tyvärr inget som hjälper...

Re: Assembler i C/C++

Postat: 23 feb 2009, 00:45
av MiSTer
Din asm funkade inte, Lars... :(

Re: Assembler i C/C++

Postat: 23 feb 2009, 01:06
av Osprey
Lite om anropen finns att läsa i "Calling conventions"...