сборка атои головокружительная ошибка - PullRequest
2 голосов
/ 10 января 2011

У нас есть строка с смещением в di. Этот процесс преобразует его в целое число в топоре. Процесс будет работать хорошо для 0-999. но, например, для 1000 или 2343 или других чисел больше 1000 не будет работать. в чем проблема ? Я запутался. также tlen - это временный байт, который я определил.

 atoi proc far
  mov cl,len
  mov ch,0
  mov ah,0
 start:
  dec cl
  jcxz addlastdigit
  mov tlen,cl;save cl
  mov al,1
  mov bl,10
  getMultiplier:
   mul bl
   Loop  getMultiplier
  mov cl,tlen ; retrive cl
  mov dl,byte ptr[di]
  sub dl,30h
  mul dl
  add num,ax
  inc di
  jmp start
 addlastdigit:
  mov ax,num
  mov dl,byte ptr[di]
  sub dl,30h
  mov dh,0

  add ax,dx

  Ret
 atoi endp

Ответы [ 2 ]

1 голос
/ 10 января 2011

Проблема в "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 и т. д.).

1 голос
/ 10 января 2011

Это довольно ужасно:)

В любом случае, непосредственная причина, по которой это не работает, заключается в том, что вы используете 8-битные умножители, в частности, mul dl. mul bl едва работает на 1000, но также не работает на 10000 и выше.

Общий совет: научитесь использовать отладчик для пошагового выполнения кода и посмотрите, где он идет не так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...