Мой ответ на Как вывести целое число в Программирование на уровне сборки без printf из библиотеки c? , который вы уже связали, показывает, что сериализация целого числа в память как десятичного числа ASCII дает вам длину, так что вы не использовать для (пользовательская версия) strlen
здесь.
(Ваш msg
имеет постоянную длину во время сборки, поэтому глупо не использовать это.)
Чтобы напечатать целое число со знаком, используйте следующую логику:
if (x < 0) {
print('-'); // or just was_negative = 1
x = -x;
}
unsigned_intprint(x);
Без знака покрывает корпус abs(most_negative_integer)
, например, в 8-битном - (-128)
переполнение до -128
со знаком. Но если вы обработаете результат этого условного neg
как unsigned , он будет корректным без переполнения для всех входных данных.
Вместо фактической печати -
, просто сохраните тот факт, что начальное число было отрицательным , и вставьте -
перед другими цифрами после генерации последней. Для баз, которые не имеют степеней 2, обычный алгоритм может генерировать цифры только в обратном порядке печати,
Мое целое число для печати x86-64 с ответом syscall обрабатывает ввод как неподписанный, поэтому вы должны просто использовать его с некоторым кодом для обработки знаков. Он был написан для Linux, но замена номера системного вызова write
сделает его работающим на Mac. У них одинаковые правила вызова и ABI.
И, кстати, xor al,al
строго хуже, чем xor eax,eax
, если только вы специально не хотите сохранить старшие 7 байтов RAX. эффективно обрабатывает только нулевое значение полных регистров .
Кроме того, repnz scasb
- это не быстро; примерно 1 сравнение в час для больших строк.
Для строк длиной до 16 байт вы можете использовать один вектор XMM с pcmpeqb
/ pmovmskb
/ bsf
, чтобы найти первый нулевой байт без цикла. (SSE2 является базовой для x86-64).