The following code:
Code: Select all
void _main(void* mbd, unsigned int magic)
{
char *port = (char *)0x3D4;
port[0] = 0x0F;
port[1] = (char)0;
port[0] = 0x0E;
port[1] = (char )0;
while (1);
}
Thanks in advance
Code: Select all
void _main(void* mbd, unsigned int magic)
{
char *port = (char *)0x3D4;
port[0] = 0x0F;
port[1] = (char)0;
port[0] = 0x0E;
port[1] = (char )0;
while (1);
}
Code: Select all
#define INB(Port, Data) __asm__ ("inb %1, %0" : "=a"(Data) : "Nd"(Port))
#define INW(Port, Data) __asm__ ("inw %1, %0" : "=a"(Data) : "Nd"(Port))
#define INL(Port, Data) __asm__ ("inl %1, %0" : "=a"(Data) : "Nd"(Port))
#define OUTB(Port, Data) __asm__ ("outb %0, %1" : : "a"(Data), "Nd"(Port))
#define OUTW(Port, Data) __asm__ ("outw %0, %1" : : "a"(Data), "Nd"(Port))
#define OUTL(Port, Data) __asm__ ("outl %0, %1" : : "a"(Data), "Nd"(Port))
Code: Select all
/usr/cross/bin/i586-elf-as -o loader.o init/loader.s
/usr/cross/bin/i586-elf-gcc -Wall -Werror -nostdlib -nostartfiles -nodefaultlibs -o kernel.o -c kernel.c
/cygdrive/c/DOCUME~1/marciof/DEFINI~1/Temp/cclyNKF0.s: Assembler messages:
/cygdrive/c/DOCUME~1/marciof/DEFINI~1/Temp/cclyNKF0.s:23: Error: suffix or operands invalid for `out'
/cygdrive/c/DOCUME~1/marciof/DEFINI~1/Temp/cclyNKF0.s:28: Error: suffix or operands invalid for `out'
/cygdrive/c/DOCUME~1/marciof/DEFINI~1/Temp/cclyNKF0.s:33: Error: suffix or operands invalid for `out'
/cygdrive/c/DOCUME~1/marciof/DEFINI~1/Temp/cclyNKF0.s:39: Error: suffix or operands invalid for `out'
make: *** [kernel.o] Error 1
Code: Select all
#define OUTB(Port, Data) __asm__ ("outb %0, %1" : : "a"(Data), "Nd"(Port))
void _main(void* mbd, unsigned int magic)
{
int row = 0, col = 0;
unsigned short position = (row*80) + col;
/* cursor LOW port to vga INDEX register */
OUTB(0x3D4, 0x0F);
OUTB(0x3D5, (unsigned char)(position&0xFF));
/* cursor HIGH port to vga INDEX register */
OUTB(0x3D4, 0x0E);
OUTB(0x3D5, (unsigned char )((position>>8)&0xFF));
while (1);
}
Code: Select all
static __inline__ void outb(unsigned short port, unsigned char val)
{
asm volatile("outb %0,%1"::"a"(val), "Nd" (port));
}
Code: Select all
void outb(unsigned short port, unsigned char val)
{
__asm__ __volatile__ ("outb %0,%1"::"a"(val), "Nd" (port));
}
I can't even ?see? that file because it's temporary, as soon as the assembler stops, the file is deleted :-\Pype.Clicker wrote: difficult to tell just like this ... we'd need that ".s" file the assembler is working on to find out ...
Code: Select all
void io_wait(void)
{
__asm__ __volatile__ ("outb %%al,$0x80");
}
Code: Select all
/usr/cross/bin/i586-elf-as -o loader.oo init/loader.s
/usr/cross/bin/i586-elf-gcc -o kernel.oo -c kernel.c -ffreestanding -g -Wall -ansi -pedantic -Werror -nostdlib -nostartfiles -nodefaultlibs -Iinclude
/cygdrive/c/DOCUME~1/marciof/DEFINI~1/Temp/ccEV8BYh.s: Assembler messages:
/cygdrive/c/DOCUME~1/marciof/DEFINI~1/Temp/ccEV8BYh.s:56: Error: bad register name `%%al'
make: *** [kernel.oo] Error 1
Code: Select all
__asm__ __volatile__ ("outb %0, $0x80" : "r"(0));
Code: Select all
void _main(void* mbd, unsigned int magic)
{
__asm__ __volatile__ ("outb %0, $0x80" : "r"(0));
}
Code: Select all
/usr/cross/bin/i586-elf-as -o loader.o init/loader.s
/usr/cross/bin/i586-elf-gcc -Wall -Werror -nostdlib -nostartfiles -nodefaultlibs -pedantic -o kernel.o -c kernel.c
kernel.c: In function `_main':
kernel.c:10: error: invalid lvalue in asm statement
kernel.c:10: error: output operand constraint lacks `='
make: *** [kernel.o] Error 1
Code: Select all
__asm__ __volatile__ ("outb %0, $0x80" : : "r"(0));
Code: Select all
/cygdrive/c/DOCUME~1/marciof/DEFINI~1/Temp/ccIS0T3r.s: Assembler messages:
/cygdrive/c/DOCUME~1/marciof/DEFINI~1/Temp/ccIS0T3r.s:55: Warning: using `%al' instead of `%eax' due to `b' suffix
Code: Select all
asm volatile ("outb %%al,$0x80");
When you find it, please let me know.AR wrote: (...) there should be probably some way to tell GCC about it but I'll have to look it up.
So... that section in the faq should be fixed to prevent future problems, right?AR wrote: (...)That code may have been valid in an earlier version of GCC but it would appear to be wrong in the newer releases.
Code: Select all
__asm__ ("outb %%al, $0x80" : : "a"(0)); /* Load zero in EAX then use AL in the instruction */