Проблема в "mul dl". DL является 8-битным регистром, поэтому максимальное значение, которое может содержать DL, равно 255. Вероятно, вы умножите на 100 правильно (например, «99 * 100 + 9 = 999), а затем не умножите на 1000 или выше.
Код должен использовать регистры большего размера. Код также должен быть переписан так, чтобы он делал только один MUL на символ.
Пример (NASM, не проверено):
atioi:
xor eax,eax
.nextChar:
movzx ebx,byte [di]
inc di
sub bl,'0'
jb .invalidChar
cmp bl,9
ja .invalidChar
lea eax,[eax*4+eax]
sub ecx,1
lea eax,[eax*2+ebx]
jne .nextChar
ret
.invalidChar:
; Not sure what you're planning to do with error handling..
Приведенный выше код предполагает использование процессора 80386 или новее (а будет работать в реальном режиме или 16-битном коде) и должен обрабатывать значения до "2 ** 32-1" (более 4 млрд. ) правильно.
Для процессоров 80x86, которые, вероятно, устарели до вашего рождения (80286 и старше), вам нужно использовать пару регистров (например, DX: AX) вместо 32-битных регистров, чтобы получить тот же диапазон, или ограничить его к результатам, которые меньше 65536 и используют 16-битные регистры вместо 32-битных регистров (например, замените EBX на BX, EAX на AX и т. д.).