사용자로부터 십진수 문자('0'~'9')만으로 이루어진 문자열을 입력 받고, 이를 해당 정수로 변환하는 프로그램을 만드는 문제인데
문자 '0' 의 아스키 코드 값은 0x30 ~ 문자 '9'의 아스키 코드 값은 0x39 를 이용해서 바꿔야 하는데 어떻게 바꿔야할지 잘 모르겠습니다
minus: mov eax, ebx
mov ecx, 10
mul ecx ; 원래 저장되어있던 수에 10을 곱해줍니다.
mov ecx, 0
mov ecx, [string+edx] ; edx 는 0부터 시작해서 몇 번째 수인지를 표시하기 위해서 썼습니다.
; 예를 들면 12345 에서 edx 가 0일 경우 1
sub ecx, 0x30
add eax, ecx ; 1234의 경우 (((((0 + 1) * 10 ) + 2) * 10 ) +3) * 10 + 4 의 방법으로 계산합니다
mov ebx, eax
inc edx ; 다음 수를 계산하기 위해서 배열의 다음 항으로 갑니다.
cmp byte [string+edx-1], 0 ; 마지막을 null 로 줬습니다. 비교해서 같을 경우 루프를 종료합니다.
jne minus
...
이런 식의 코드를 짜봤는데 단순히 0x30 을 빼준 다음 저장하는 식으로는 변환이 안 되는 것 같습니다.
어떤 식으로 해야할지 도움 좀 주시면 감사하겠습니다.
mov ecx, [xxx]를 하면 4바이트가 read돼요. mov 명령어는 똑같은 크기의 데이터만을 옮길 수 밖에 없으니깐. byte 단위로 연산하려면 mov cl, [xxx] 식으로 8비트 레지스터를 써야 됨. 아니면 movzx 명령어로 비트 확장 해야 됨.
그럼 mov cl, [string+ edx] 으로 바꿔주면 sub ecx, 0x30 해도 제대로 되는 건가요
내가 직접 코딩해서 올려줄 게 ㄱㄷ
masm32 깔고 만드느라 시간이 좀 걸렸음. 코드 올렸당 ㅋㄷ
http://autogram.tk/이
중고차 어플리케이션 어떤가요?