Page 1 of 1

C inline assembly question

Posted: Sun Mar 19, 2017 10:47 am
by cyanide
Hi!
I have some trouble with using the inline assembly when writing in c.
I have this code:

Code: Select all

void isr0() {
	__asm__ (
		"pusha\n"
		"push gs\n"
		"push fs\n"
		"push ds\n"
		"push es\n"
		"call interrupt_0\n"
		"pop es\n"
		"pop ds\n"
		"pop fs\n"
		"pop gs\n"
		"popa\n"
		"iret\n"
	);
}

void interrupt_0() {
	print("Divide by 0!\n");
	asm("cli");
  	asm("hlt");
}
However, when I try to compile it I get an error:

Code: Select all

kernel.o:kernel.c:(.text+0x2a9): undefined reference to `gs'
kernel.o:kernel.c:(.text+0x2af): undefined reference to `fs'
kernel.o:kernel.c:(.text+0x2b5): undefined reference to `ds'
kernel.o:kernel.c:(.text+0x2bb): undefined reference to `es'
kernel.o:kernel.c:(.text+0x2c0): undefined reference to `interrupt_0'
kernel.o:kernel.c:(.text+0x2c6): undefined reference to `es'
kernel.o:kernel.c:(.text+0x2cc): undefined reference to `ds'
kernel.o:kernel.c:(.text+0x2d2): undefined reference to `fs'
kernel.o:kernel.c:(.text+0x2d8): undefined reference to `gs'
Can someone please help me with that?

Re: C inline assembly question

Posted: Sun Mar 19, 2017 11:27 am
by mikegonta
cyanide wrote:I have some trouble with using the inline assembly when writing in c.
However, when I try to compile it I get an error:
Can someone please help me with that?
To use intel syntax in GCC inline asm you need to use the -masm=intel option when calling GCC.

Re: C inline assembly question

Posted: Sun Mar 19, 2017 11:50 am
by cyanide
Thanks a lot, that helped :D

Re: C inline assembly question

Posted: Sun Mar 19, 2017 12:02 pm
by Octocontrabass
You can't do that in inline assembly. You have to put it in a separate assembly file, or try to figure out how __attribute__ ((interrupt)) works.