코드 그대로 따라서 해봤는데 숫자를 하나만 입력하면 그대로 나오는데 2개 이상 입력하면 쓰레기값 나와요..
익명(66.249)2015-05-24 06:10
코드 그대로 따라해봤는데 숫자 2개 이상 넣으면 이상한 값 나와요..
익명(183.98)2015-05-24 06:10
잉?
ㅅㅅㅅ(125.128)2015-05-24 06:10
아 맞다. mul은 edx 값을 바꿔.
ㅅㅅㅅ(125.128)2015-05-24 06:11
그러니 너가 짠 코드는 제대로 돌아갈 리가 없는 거였지 =_=... minus: 위의 mov edx, 0부터 쭉 edx를 edi로 모조리 고치3
ㅅㅅㅅ(125.128)2015-05-24 06:11
[] 안에 있는 edx 도 edi 로 바꿔야 하나요 이건 그대로 킵하나요
익명(66.249)2015-05-24 06:14
당연히 바꿔야지 :p
ㅅㅅㅅ(125.128)2015-05-24 06:15
정확하게 딱 minus: 바로 윗 줄의 mov edx, 0 부터임.
ㅅㅅㅅ(125.128)2015-05-24 06:15
그 위의 repeat 부분의 edx는 건드릴 필요는 없어.
ㅅㅅㅅ(125.128)2015-05-24 06:15
와 제대로 나왔네요 감사합니다...
익명(66.249)2015-05-24 06:16
근데 왜 edx 를 edi 로 바꿔야 되나요
익명(66.249)2015-05-24 06:17
MUL 명령어는 곱셈 명령어인 건 알지?
ㅅㅅㅅ(125.128)2015-05-24 06:18
나머지는 저 혼자 보면서 어떻게든 공부할 수 있을 것 같은데 이건 왜인지...
익명(66.249)2015-05-24 06:18
네 그건 알아요
익명(66.249)2015-05-24 06:18
MUL (32비트 레지스터) 를 수행할 경우 EDX:EAX = EAX * 32비트 값의 연산을 수행해. EDX:EAX는 저 두 공간을 합쳐서 하나의 64비트 공간처럼 본다는 의미이고. 2진수로 나타냈을 때 낮은 자리 32비트는 EAX에, 높은 자리 32비트는 EDX에 저장됨. 그래서 매번 MUL 명령어를 쓸 때마다 EDX 값이 0으로 초기화되는 거지. :p
ㅅㅅㅅ(125.128)2015-05-24 06:19
그럼 mul 쓰면 32비트가 초과되지 않으면 edx 는 0이 되고 eax 에는 결과값이 저장된다는 뜻인가요
익명(66.249)2015-05-24 06:21
그렇지. 왜 굳이 EDX까지 쓰냐면 32비트(2^32) * 32비트(2^32)는 이론상 64비트(2^64)까지 값이 나올 수 있기 때문에 그렇게 해놓은 거야.
ㅅㅅㅅ(125.128)2015-05-24 06:23
그래서 EDX 레지스터를 index용으로 쓴 게 에러야. 사실 인덱스용은 ESI/EDI 레지스터를 쓰는 게 맞아. 더 정확하게는 mov esi, string 이런 식으로 주소값을 넣은 뒤 그거 자체를 포인터로 하고 inc esi 주소 값을 증가시키는 방식으로 loop를 도는 거지. 이게 정석이지만... 난 너의 스타일대로 짜 준 거 ㅋㅋ
ㅅㅅㅅ(125.128)2015-05-24 06:24
설명 자세하게 해주셔서 정말 감사합니다.. 나머지는 혼자 분석해가면서 복습해볼게요 정말 감사합니다
코드 그대로 따라서 해봤는데 숫자를 하나만 입력하면 그대로 나오는데 2개 이상 입력하면 쓰레기값 나와요..
코드 그대로 따라해봤는데 숫자 2개 이상 넣으면 이상한 값 나와요..
잉?
아 맞다. mul은 edx 값을 바꿔.
그러니 너가 짠 코드는 제대로 돌아갈 리가 없는 거였지 =_=... minus: 위의 mov edx, 0부터 쭉 edx를 edi로 모조리 고치3
[] 안에 있는 edx 도 edi 로 바꿔야 하나요 이건 그대로 킵하나요
당연히 바꿔야지 :p
정확하게 딱 minus: 바로 윗 줄의 mov edx, 0 부터임.
그 위의 repeat 부분의 edx는 건드릴 필요는 없어.
와 제대로 나왔네요 감사합니다...
근데 왜 edx 를 edi 로 바꿔야 되나요
MUL 명령어는 곱셈 명령어인 건 알지?
나머지는 저 혼자 보면서 어떻게든 공부할 수 있을 것 같은데 이건 왜인지...
네 그건 알아요
MUL (32비트 레지스터) 를 수행할 경우 EDX:EAX = EAX * 32비트 값의 연산을 수행해. EDX:EAX는 저 두 공간을 합쳐서 하나의 64비트 공간처럼 본다는 의미이고. 2진수로 나타냈을 때 낮은 자리 32비트는 EAX에, 높은 자리 32비트는 EDX에 저장됨. 그래서 매번 MUL 명령어를 쓸 때마다 EDX 값이 0으로 초기화되는 거지. :p
그럼 mul 쓰면 32비트가 초과되지 않으면 edx 는 0이 되고 eax 에는 결과값이 저장된다는 뜻인가요
그렇지. 왜 굳이 EDX까지 쓰냐면 32비트(2^32) * 32비트(2^32)는 이론상 64비트(2^64)까지 값이 나올 수 있기 때문에 그렇게 해놓은 거야.
그래서 EDX 레지스터를 index용으로 쓴 게 에러야. 사실 인덱스용은 ESI/EDI 레지스터를 쓰는 게 맞아. 더 정확하게는 mov esi, string 이런 식으로 주소값을 넣은 뒤 그거 자체를 포인터로 하고 inc esi 주소 값을 증가시키는 방식으로 loop를 도는 거지. 이게 정석이지만... 난 너의 스타일대로 짜 준 거 ㅋㅋ
설명 자세하게 해주셔서 정말 감사합니다.. 나머지는 혼자 분석해가면서 복습해볼게요 정말 감사합니다
http://dblack.tk
커뮤니티 사이트 입니다 많은 이용 부탁 드립니다.