I'm developing a basic C kernel in a Kali machine and testing it inside QEMU. This is the kernel code:
void kernel_main();
void print();
void print() {
char* vidMem = (char*)0xb8000;
*vidMem = "A";
vidMem++;
*vidMem = 0x0f;
}
void entry() {
kernel_main();
while(1);
}
void kernel_main() {
print();
}
This prints Z
instead of A
, but if I replace "A"
with the ASCII value for A
, 0x41
, it works as expected and prints A
to the screen. Additionally, I also get this error:
kernel.c:6:10: warning: assignment to 'char' from 'char *' makes integer from pointer without a cast [-Wint-conversion]
6 | *vidMem = "A";
| ^
If I understand it correctly, the compiler thinks I'm trying to change the value of vidMem
itself to a different value of a different data type; however, I'm dereferencing the vidMem
variable and only changing the byte of memory pointed to by vidMem
, so I'm confused as to why I get this error. I don't get the error when I replace "A"
with 0x41
, so all I see is the compiler is treating "A"
and 0x41
differently. Why is that and how can I print a character I want without needing to provide its ASCII value?
This is equivalent to
"A" is a string, not a character, so you're assigning (the lowest byte of) the address of the string
"A"
into that memory position.You want to do:
Note the single quotes, which makes it a
char
literal.