LINUX.ORG.RU

История изменений

Исправление 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 очень популярная операция, то её оптимальное кодирование важно.