История изменений
Исправление KivApple, (текущая версия) :
Чтобы проверить на 0 регистр на x86 можно сделать:
test eax, eax
jz error
Проверка на -1 и другие значения будет длиннее (например, придётся использовать cmp, который несёт в опкоде константу и его опкод длиннее, либо трюки с inc + test, которые добавляют инструкцию, плюс потом нужно восстанавливать исходное значение, если оно нам таки нужно).
Да, процессорных архитектур много, но практически везде есть быстрое сравнение с нулём (без необходимости этот самый ноль явно кодировать в опкоде как константу). А с -1 нет.
С учётом того, что проверка на NULL очень популярная операция, то её оптимальное кодирование важно.
Да, по 0 адресу может что-то лежать. Но, во-первых, на первых компьютерах не было защиты памяти и программа продолжит работу и при чтении/записи по адресу -1 где памяти нет. Плюс небольшая адресная арифметика (тот же +1 для доступа ко второму байту word) и вот мы опять залезли в нулевой адрес. Защита переоценена. А, во-вторых, пользовательские структуры по 0 адресу не лежат, этого достаточно. Адрес таблицы прерываний не будет хранится/передаваться в структуры, где NULL имеет значение, он будет использоваться в редких системных функциях (например, смена обработчика прерывания), которые знают, что проверять на NULL адрес не нужно.
Исправление KivApple, :
Чтобы проверить на 0 регистр на x86 можно сделать:
test eax, eax
jz error
Проверка на -1 и другие значения будет длиннее (например, придётся использовать cmp, который несёт в опкоде константу и его опкод длиннее, либо трюки с inc + test, которые добавляют инструкцию, плюс потом нужно восстанавливать исходное значение, если оно нам таки нужно).
Да, процессорных архитектур много, но практически везде есть быстрое сравнение с нулём (без необходимости этот самый ноль явно кодировать в опкоде как константу). А с -1 нет.
С учётом того, что проверка на NULL очень популярная операция, то её оптимальное кодирование важно.
Да, по 0 адресу может что-то лежать. Но, во-первых, на первых компьютерах не было защиты памяти и программа продолжит работу и при чтении по адресу -1 где памяти нет. А, во-вторых, пользовательские структуры по 0 адресу не лежат, этого достаточно. Адрес таблицы прерываний не будет хранится/передаваться в структуры, где NULL имеет значение.
Исправление KivApple, :
Чтобы проверить на 0 регистр на x86 можно сделать:
test eax, eax
jz error
Проверка на -1 и другие значения будет длиннее (например, придётся использовать cmp, который несёт в опкоде константу и его опкод длиннее, либо трюки с inc + test, которые добавляют инструкцию, плюс потом нужно восстанавливать исходное значение, если оно нам таки нужно).
Да, процессорных архитектур много, но практически везде есть быстрое сравнение с нулём (без необходимости этот самый ноль явно кодировать в опкоде как константу). А с -1 нет.
С учётом того, что проверка на NULL очень популярная операция, то её оптимальное кодирование важно.
Исправление KivApple, :
Чтобы проверить на 0 регистр на x86 можно сделать:
test eax, eax
jz error
Проверка на -1 и другие значения будет длиннее (например, придётся использовать cmp, который несёт в опкоде константу и его опкод длиннее, либо трюки с inc + test, которые добавляют инструкцию, плюс потом нужно восстанавливать исходное значение, если оно нам таки нужно).
С учётом того, что проверка на NULL очень популярная операция, то её оптимальное кодирование важно.
Да, процессорных архитектур много, но практически везде есть быстрое сравнение с нулём (без необходимости этот самый ноль явно кодировать в опкоде как константу). А с -1 нет.
Исправление KivApple, :
Чтобы проверить на 0 регистр на x86 можно сделать:
test eax, eax
jz error
Проверка на -1 и другие значения будет длиннее (например, придётся использовать cmp, который несёт в опкоде константу и его опкод длиннее, либо трюки с inc + test, которые добавляют инструкцию, плюс потом нужно восстанавливать исходное значение, если оно нам таки нужно).
С учётом того, что проверка на NULL очень популярная операция, то её оптимальное кодирование важно.
Да, процессорных архитектур много, но практически везде есть быстрое сравнение с нулём. А с -1 нет.
Исходная версия KivApple, :
Чтобы проверить на 0 регистр на x86 можно сделать:
test eax, eax
jz error
Проверка на -1 и другие значения будет длиннее (например, придётся использовать cmp, который несёт в опкоде константу и его опкод длиннее, либо трюки с inc + test, которые добавляют инструкцию, плюс потом нужно восстанавливать исходное значение, если оно нам таки нужно).
С учётом того, что проверка на NULL очень популярная операция, то её оптимальное кодирование важно.