- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
static int parse_num(const char *s, size_t *out) {
if (s == NULL || *s == '\0')
return -1;
char *end = 0;
errno = 0;
uint64_t num = strtoull(s, &end, 0);
if (errno != 0)
return -1;
if (*end != '\0')
return -1;
if (num > SIZE_MAX)
return -1;
*out = (size_t)num;
return 0;
}
Кто там хотел посоставлять 64 битный код из ascii символов?
А нету констант чтоли?
> fprintf(stderr, "RAX=%016llx RBX=%016llx RCX=%016llx RDX=%016llx\n", regs.rax, regs.rbx, regs.rcx, regs.rdx);
fprintf(stderr, "RSI=%016llx RDI=%016llx RSP=%016llx RBP=%016llx\n", regs.rsi, regs.rdi, regs.rsp, regs.rbp);
fprintf(stderr, "R8 =%016llx R9 =%016llx R10=%016llx R11=%016llx\n", regs.r8, regs.r9, regs.r10, regs.r11);
fprintf(stderr, "R12=%016llx R13=%016llx R14=%016llx R15=%016llx\n", regs.r12, regs.r13, regs.r14, regs.r15);
блядь, ну и регистров там у вас
именно по этому я за real mode
Дык очевидно же: 0x0B код, 0х03 данные.
Это ещё не все регистры кста. Там же ещё от сопроцессора и SSE'шные. Я на них тупо забил.
З.Ы. Завтра добавлю генерецию пейджтейбла, а то руками указывать как-то некрасиво.
Что вообще самое сложное в написании самой простой ос? шедулер? драйверы для всякого современного говна типа pci-e и usb 3?
А у интела походу реально подгорело после фейла итантума аля IA-64 и взлёта амд64.
Настолько подгорело, что IA-32e там везде упоминается просто как костыль, прикрученный сбоку, а не как часть архитектуры. Во всех главах рассказывается сначала про 32 бита, а потом "ну а если IA-32e - то ещё вот это".
amd'шная дока в этом плане на порядок приятнее читается.
А вот от AMD и правда погорело, потому что софт стал называть режим AMD64, и до сих пор иногда называет. Как Интел мог такое вынести?
А еще AMD первые допёрли унсети драм контроллер в die.
А книжки и мануалы небось раньше писались, потом их просто апгрейтнули, не?
А на практике народ в 2020 году юзает всякую 16-битную опердень.
прикладушечку на няшной, написанную и проверенную под 32, пересобрать под другую арху и 64? Это же наверное нужно быть очень аккуратным парнем, не?
А если с астмавставками?
Вообще странная политика. Интел всякий там 16ти битный режим тянет же ровно потому, что не весь софт можно перекомпилировать
Дык никто не заставляет юзать 64-битные типы. Сделай в конпеляторе режим, в котором все размеры как в оригинале. И никто не заметит подвоха.
Ну асмовставки - да. И проебанные исходники.
32 же работает в 64, и ничего.
Ну ладно, а что делать с асмом-то? И со всякими тонкими оптимизациями?
А всякий ядреный софт? драва? Там же небось другой лейаут памяти, i/o нету, еще чонить
А надо? Оно ж раньше как-то работало, памяти хватало.
> оптимизациями
Ну если новый проц мощнее - тупо забить. Не хуже чем раньше - и ладно. Для переезда сойдёт.
А вот это вроде одна из причин, по которой в десктопную винду PAE не завезли. Все понахардкодили себе 32-битных адресов.
> i/o нету
Ты давно видел железку с i/o? Ну кроме легаси хуйни, которая не может на него забить и просто бахнуть MMIO регион.
Вот уж реально плевок в вечность. Одни долбоёбы поюзали недокументированнную фичу. Другие долбоебы ее узаконили, привернув костыль через клавиатурный порт. А теперь все страдают и эмулируют это говнище.
уменьшать размер регистра сегмента и его двигать потом?
К примеру, чтобы работать с 40кб массивом который начинается на 0х8000 тебе постоянно придется дрочить сегментные регистры.
Нахлёстом сегментов они эту проблему и пытались решить: ты ставишь ds на начало массива и течёшь.
Без дескрипторных табличек так не выйдет. Будет что-то одно из джвух.
Полная говнина.
Сайт-эффектная питушатня errno, код разврата, ещё и кокозатель.
> кокозатель
Ну за это спасибо, кстати. Хоть допарсить можно или проверить что до конца разобрал. В atoi было хуже.
Так atoX это же по сути просто «удобные» обёртки над strtoX, без указателя и прибитой десятичкой.
Если бы туда завезли гарантированный errno, были бы нормальные функции.
Edit: а длинные питухи действительно потом появились:
Какая ошибка уровня E_NOTICE )))
Для строк функция скорее всего вернет 0, хотя это зависит от первого символа в строке.
Ахаха
Тот самый момент, когда распарсить аргумент сложнее, чем поднять виртуальную машину, которой он понадобился.
На входе const char*, на выходе просто char*.
С-с-с-ука.
Зачем? Зачем?
Поэтому на выходе конста в стандартной либе нет.