2016-12-27 4 views
1

문자열 형식을 int로 구문 분석해야하지만 코드를 변경해야하는 코드가 있습니다. 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 

그것은 당신이 (가) call 보내고 atoi 함수 전에 오프셋 아스키의 옵셋 메모리 또는 push와 하나 invoke atoi 함수의 PROC 필요 658,688

+0

http://x86.renejeschke.de/html/file_module_x86_id_160.html ... 'lodsd'는 정확한 수있다. 아마도 'mov toparse'와 마찬가지로 0이 아닌 것입니다. 디버거에서 체크인 했습니까? 소스를 읽는 것은 어렵습니다. 순수한 어셈블리가 아니기 때문에 일부 매크로 또는 무언가가 있다고 생각하거나 그 "todo"코멘트 일 수도 있습니다. – Ped7g

+1

@ped 이것은 주석이 아닙니다. 이 코드는 MASM의 상위 어셈블리 구문을 사용합니다. 매크로처럼 보이지만 어셈블러에 내장되어 있습니다. –

+2

'lodsd'가 잘못되었습니다. 더블 워드 (DWORD)를로드하지만 'DB' (Declare Byte)를 사용하여 문자열 배열을 선언 했으므로 문자의 크기는 분명 바이트 크기입니다. 아마도'lodsb '를 원할 것입니다. –

답변

1

를 반환합니다. 현재 esi에는 이미 inputbuff에있는 임의의 값만 포함됩니다.

전체 문자열을 성공적으로 처리하도록 proc을 수정했습니다. 하여 문자열 인코딩 UTF-32 또는 다른 4 바이트 인 경우 인코딩

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 
+0

['lodsd'] (http://felixcloutier.com/x86/LODS:LODSB:LODSW:LODSD:LODSQ.html)는 4 바이트를로드하고 ESI를 4 씩 증가시킵니다. 문자가 UTF-32로 저장되지 않는다면, 그렇지 않습니다. 일하게. 루프 이전에 EAX를 0으로 설정하거나 LODSB를 사용하거나'movzx eax, byte [esi]'/'inc esi'를 사용해야합니다 (최신 Intel CPU에서는 LODSB의 경우 3 대신 2uops). –

+0

또한 'call'이 반환 된 후에도 코드는 여전히 'atoi'에 속합니다. 그러나 MASM의 매크로 같은 것들이'mov esi, inputBuff'에서 그것을로드하는 곳에 arg를 넣기 위해'call'을 사용하는 것에 대한 좋은 지적이 있습니다. IMO는'mov esi, [ebp + 8]'(또는 스택 프레임을 만들지 않았다면'[esp + 4] ')와 비교하여 실제로 일어나는 것을보기가 더 어렵게 만듭니다. –

+0

코드가 작동하지만 단 한자리 숫자 일뿐입니다. 그리고 LODSD는 버퍼의 끝에서 2 바이트를 포함하여 다음 3 바이트에서 0을로드하여 나머지 EAX를 0으로 만듭니다. 이 코드를 데이터 섹션에있는 프로그램에 포함 시키 자마자 버퍼가 0이되는 바이트 수를 셀 수 없으므로 중단됩니다. –