SVNからのミラー
This commit is contained in:
120
main.c
Normal file
120
main.c
Normal file
@@ -0,0 +1,120 @@
|
|||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
static uint32_t x = 123456789, y = 362436069, z = 521288629, w = 88675123;
|
||||||
|
|
||||||
|
static uint32_t xorshift128(void) {
|
||||||
|
uint32_t t = x;
|
||||||
|
t ^= t << 11;
|
||||||
|
t ^= t >> 8;
|
||||||
|
x = y; y = z; z = w;
|
||||||
|
w ^= w >> 19;
|
||||||
|
w ^= t;
|
||||||
|
return w;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t prand(void) {
|
||||||
|
return xorshift128();
|
||||||
|
}
|
||||||
|
|
||||||
|
void psrand(uint32_t seed) {
|
||||||
|
if (seed == 0) seed = 1;
|
||||||
|
|
||||||
|
x = seed;
|
||||||
|
y = seed ^ 0xDEADBEEF;
|
||||||
|
z = seed ^ 0xCAFEBABE;
|
||||||
|
w = seed ^ 0xF00DCAFE;
|
||||||
|
|
||||||
|
for (int i = 0; i < 10; i++) xorshift128();
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t genseed(void) {
|
||||||
|
uint32_t seed = 0;
|
||||||
|
seed ^= (uint32_t)(uintptr_t)&seed;
|
||||||
|
|
||||||
|
uint32_t uninit_var;
|
||||||
|
seed ^= uninit_var;
|
||||||
|
|
||||||
|
volatile uint32_t counter = 0;
|
||||||
|
for (int i = 0; i < 1000; i++) counter += i;
|
||||||
|
|
||||||
|
seed ^= counter;
|
||||||
|
seed ^= (uint32_t)__LINE__ ^ (uint32_t)(uintptr_t)__FILE__;
|
||||||
|
|
||||||
|
x = seed;
|
||||||
|
y = seed ^ 0xDEADBEEF;
|
||||||
|
z = seed ^ 0xCAFEBABE;
|
||||||
|
w = seed ^ 0xF00DCAFE;
|
||||||
|
seed = xorshift128();
|
||||||
|
|
||||||
|
if (seed == 0) seed = 1;
|
||||||
|
return seed;
|
||||||
|
}
|
||||||
|
|
||||||
|
void uint_to_string(uint32_t num, char *buf, int *len) {
|
||||||
|
char tmp[11];
|
||||||
|
int i = 0;
|
||||||
|
if (num == 0) {
|
||||||
|
buf[0] = '0';
|
||||||
|
buf[1] = '\0';
|
||||||
|
*len = 1;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (num > 0) {
|
||||||
|
tmp[i++] = (num % 10) + '0';
|
||||||
|
num /= 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
*len = i;
|
||||||
|
for (int j = 0; j < i; j++) buf[j] = tmp[i - 1 - j];
|
||||||
|
|
||||||
|
buf[i] = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline long syscall(long arg1, long arg2, long arg3) {
|
||||||
|
#if defined(__linux__)
|
||||||
|
long num = 1;
|
||||||
|
long ret;
|
||||||
|
register long rdi asm("rdi") = arg1; // ファイルディスクリプタ
|
||||||
|
register long rsi asm("rsi") = arg2; // バッファー
|
||||||
|
register long rdx asm("rdx") = arg3; // 長さ
|
||||||
|
register long rax asm("rax") = num; // システムコール:書き込み
|
||||||
|
__asm__ volatile ("syscall"
|
||||||
|
: "=a"(ret)
|
||||||
|
: "r"(num), "r"(arg1), "r"(arg2), "r"(arg3)
|
||||||
|
: "rdi", "rsi", "rdx", "rcx", "r11", "memory");
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
#elif defined(__FreeBSD__)
|
||||||
|
long num = 4;
|
||||||
|
long ret;
|
||||||
|
__asm__ volatile (
|
||||||
|
"mov %1, %%rax\n"
|
||||||
|
"mov %2, %%rdi\n"
|
||||||
|
"mov %3, %%rsi\n"
|
||||||
|
"mov %4, %%rdx\n"
|
||||||
|
"syscall\n"
|
||||||
|
: "=a"(ret)
|
||||||
|
: "r"(num), "r"(arg1), "r"(arg2), "r"(arg3)
|
||||||
|
: "rdi", "rsi", "rdx", "rcx", "r8", "r9", "r10", "r11", "memory", "cc"
|
||||||
|
);
|
||||||
|
return ret;
|
||||||
|
#else
|
||||||
|
return 0;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(void) {
|
||||||
|
psrand(genseed());
|
||||||
|
|
||||||
|
char buf[32];
|
||||||
|
int blen;
|
||||||
|
int min = 0x01, max = 0xFF;
|
||||||
|
int random = min + (prand() % (max - min + 1));
|
||||||
|
|
||||||
|
uint_to_string(random, buf, &blen);
|
||||||
|
syscall(1, (long)buf, blen);
|
||||||
|
syscall(1, (long)"\n", 1);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user