Когда CF стоит - им проще реализовывать булевое значение. В случае возврата CF мы сразу же делаем jc/jnc, а если в r/e/ax единицы надо делать test rax,rax/jnz Label
Потому что в отличие от языков высшего уровня ассемблер дает возможность писать компактный и быстрый код, разница от 5 до 10 раз. Собственная реализация sprintf - 407 байт, в отличие от 25килобайт на С