Low Level C

hrisiz

Active Member
Joined
Feb 3, 2010
Messages
429
Reaction score
81
Здравейте :) Започнах да се занимавам с някакво съпер ниско ниво на С понеже ми дадоха такова домашно ... и ми стана интересно, но нещо немога да се оправя :S

Все още съм на Hello World и за момента проблема е при принтиране. Компилирам към corei7 и четох, че там са малко по различни регистрите от тези на 8086(за който ми обясняваха как бачка ...) :) Затова започнах нещо и успях да принтирам нещо от масив ,но когато пусках масива да се принтира от цикъл и .... всичко умря ...

Ето го кода който драснах
__asm__(".code16\n");
__asm__("jmpl $0x0000, $main\n");
void printChar(unsigned int thechar){
__asm__("int $0x10" : : "a"(0x0e00| thechar), "r"(0x0007));
}
void main() {
char string[] = "Hello World";
// printChar(string[0]);
int i = 0;
while(string != '\0'){
printChar(string);
i++;
}
// printChar(string[1]);
}


а ето и грешката
/tmp/ccVOgan8.s: Assembler messages:
/tmp/ccVOgan8.s:40: Error: `movabs' is only supported in 64-bit mode
/tmp/ccVOgan8.s:41: Error: bad register name `%rsp)'
/tmp/ccVOgan8.s:50: Error: bad register name `%rax'
/tmp/ccVOgan8.s:51: Error: bad register name `%rsp)'
/tmp/ccVOgan8.s:54: Error: bad register name `%rdx'
/tmp/ccVOgan8.s:57: Error: bad register name `%rdx)'
make: *** [test] Error 1
за да компилирам ползвам
gcc -c -g -Os -march=corei7 -ffreestanding -Wall -Werror test.c -o test.o

Моля ако някой може да помогне :)
 
Last edited:

pafa7a

Well-Known Member
Joined
Jul 9, 2009
Messages
1,398
Reaction score
814
Изобщо представа си нямам от С , но по ерор-а мога да ти кажа според мен какво ти е :D
/tmp/ccVOgan8.s:40: Error: `movabs' is only supported in 64-bit mode
Демек movabs поддържа само 64 бита
 

hrisiz

Active Member
Joined
Feb 3, 2010
Messages
429
Reaction score
81
Изобщо представа си нямам от С , но по ерор-а мога да ти кажа според мен какво ти е :D
/tmp/ccVOgan8.s:40: Error: `movabs' is only supported in 64-bit mode
Демек movabs поддържа само 64 бита

:D еммм с 64 bit Ubuntu съм.
Но този код
__asm__(".code16\n");
__asm__("jmpl $0x0000, $main\n");
void printChar(unsigned int thechar){
__asm__("int $0x10" : : "a"(0x0e00| thechar), "r"(0x0007));
}
void main() {
char string[] = "Hello World";
printChar(string[0]);
printChar(string[1]);
}
работи :)
Но ми се иска да не трбява да пиша 20 реда за да принтирам 20 символен текст ... :Д
 
Last edited:

Stifi

New Member
Joined
Jun 5, 2008
Messages
175
Reaction score
11
нещо не мога да ги хвана логиката, вместо да си играеш с асм и те първа да учиш адреси...
щом не намираш лесния начин ;/ printchar => printf __asm__ => trash
 

hrisiz

Active Member
Joined
Feb 3, 2010
Messages
429
Reaction score
81
нещо не мога да ги хвана логиката, вместо да си играеш с асм и те първа да учиш адреси...
щом не намираш лесния начин ;/ printchar => printf __asm__ => trash

Значи аз с адреси нямам проблеми имам проблеми с регистрите на 64 битов процесор. Иначе компилирам ли си към 32 бита и почти всичко е наред(само дето ми свърши паметта заделена от ld file и сега търся начин да я увелича без да прецаквам работата на емулатора(bochs) Ако някой има идеи да сподели или поне да каже от какво се нуждае bochs за да чете по големи файлове :) ) :) Не мога да разбера какво точно предлагаш, но ако имаш предвид за printf от stdio.h няма как да го ползвам понеже пиша система, която да работи направо върху BIOS. :)