- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
unsigned strlen(const char *str)
{
const char *ptr;
for (ptr = str; *ptr; ++ptr);
return ptr - str;
}
char *strcpy(char *dst, const char *src)
{
while((*dst++ = *src++) != 0);
return dst;
}
namespace std
{
class string
{
public:
string(const char *str = 0) : size(str ? strlen(str) : 0)
{
this->str = new char[size + 1];
if(str) strcpy(this->str, str);
else this->str[0]=0;
}
string(const string &str) : size(str.size)
{
this->str = new char[size +1];
strcpy(this->str, str.str);
}
~string()
{
delete[] str;
}
const char* c_str() const
{
return str;
}
private:
char *str;
unsigned size;
};
class Cout
{
public:
Cout &operator<< (const char *str)
{
unsigned len = strlen(str);
asm volatile (
"movl $0x04, %%eax\n"
"movl $0x01, %%ebx\n"
"int $0x80\n"
:
: "c"(str), "d"(len));
return *this;
}
Cout &operator<< (const string &str)
{
operator<< (str.c_str());
return *this;
}
} cout;
}
int main()
{
std::string str = "Hello World!";
std::cout << str << "\n";
return 0;
}
всю логику делать на кт315
А не люблю AT&Tшный синтаксис
Но всё же "Царь переносимого кода" звучало бы посильнее. С учётом местной специфики
Ну там sysenter был.
На самом деле, в винде точно так же. Все эти kernel32.dll и.т.п. просто более высокоуровневые обёрточки над сисколлами, которые можно дёргать через int/sysenter/syscall.
А ОП как раз таки захотел написать прогу, которая не будет юзать все эти сахарные so'шки, а будет общаться только с ядром операционки.
Отсутствие одного заголовка не мешает самому подключиться к нужным сошкам.
> одного заголовка
Ну и саму либу он тоже не линкует к проге.
http://ideone.com/UNXSt1
P.S. ideone не даёт опции задавать, поэтому main().
Но интеграция того стоит - гцц старается, чтобы значения в нужных регистрах вовремя оказались и т.п. И в дизасме вставка не выглядит инородным телом, как в той же вижуалке.
Кстати, там же не только конкретные регистры можно писать, но и полезные штуки типа "любой регистр", "память", "память или регистр" и т.п.
http://pastebin.com/CZGq2pLw
Парсер BBCode лох
"игнорировать \n" читай как "игнорировать \0"
PS. код писал давно.
PS. Точка входа в Linux не main, а _start.
Но я же написал, почему там main... ideone команду компилятора не даёт поправить.
Вот тут можно задать свои ключи.