Разбить строку на целое в сборе

У меня есть код, который должен анализировать формат String для int, но он меняет f.e. 0 до 658688, и я не знаю, что с этим делать. Правильна ли команда lodsd здесь?

toparse DB 128 dup(?)
mov toparse, "0"

  atoi proc uses esi edx inputBuff:DWORD
mov esi, inputBuff
xor edx, edx
.Repeat
lodsd
.Break .if !eax
imul edx, edx, 10
sub eax, "0"
add edx, eax
.Until 0
mov EAX, EDX
ret
  atoi endp

он возвращает 658688

Ответы

Ответ 1

Вам нужно либо invoke atoi proc с смещением памяти ascii, либо push смещение перед call ing atoi. Прямо сейчас esi будет содержать только случайные значения, которые уже находятся в inputbuff.

Я пересмотрел proc так, чтобы он успешно обрабатывал полные строки.

toparse db "12345678",0

;mov toparse,"0" ; Max is 4 bytes so define string above

push offset toparse ; |
call atoi           ; - or: invoke atoi,offset toparse  

...

atoi proc uses esi inputBuff:DWORD ; Generally only need to preserve esi, edi and ebx
mov esi,inputBuff
xor edx,edx
xor eax,eax         ; Clear register
.Repeat
lodsb               ; Get one byte
.Break .if !eax
imul edx,edx,10     ; Multiply total by 10
sub eax,"0"         ; Subtract 48
add edx,eax         ; Add result to the total
.Until 0
mov eax,edx         ; Will result in 00BC614E (hex 12345678)
ret
atoi endp