해결된 질문
작성
·
648
1
어떨 때는 주어진 위치의 상위 비트가 0으로 밀리는데
(mov eax, 0x1234 하면 rax가 0x1234가 되고 상위 비트들은 다 0이 됨)
어떨 때는 딱 주어진 위치만 비트가 바뀝니다.
(위 상태에서 mov al, 0x00 하면 rax가 0x1200이 됨)
이 둘에 무슨 차이가 있는건가요? 이전 값이 쓰레기 값인지 아닌지의 차이인가요?
답변 4
3
쓰레기 값이라기보다는 기존에 있던 값 때문입니다.
동일하게 A라는 바구니를 대상으로 작업을 할 때
AL은 제일 하위 1바이트만 건드리는 것이고,
EAX는 4바이트, RAX는 8바이트 전체를 건드리게 됩니다.
위 그림을 참고 바랍니다.
mov al, 0은 1바이트를 옮기는 것이니 AL 위치에 1바이트 숫자 0 (0x00)이 들어가게 됩니다.
단 나머지 상위 7바이트 위치에 들어가 있는 값에는 변동이 없습니다.
mov eax, 0은 4바이트를 옮기는 것이니 EAX 영역에 4바이트 숫자 0 (0x00000000)가 들어가게 됩니다.
-- 추가) x64 명령어에서는 윗 32비트를 0으로 밀어버림 --
mov rax, 0은 8바이트를 옮기는 것이니 RAX 전체 영역 8바이트 숫자 0 (0x0000000000000000)이 들어가게 됩니다.
이 경우 모든 값이 0으로 덮어 쓰이게 됩니다.
요약하면 mov eax, 0x1234 후 mov al, 0x00을 하면,
RAX [ 0x00000000 00001234 ]인 상태에서
mov al, 0에 의해서 가장 하위 바이트가 0x00으로 밀리게 되니,
34에 위치에 00이 들어가서 RAX [ 0x 00000000 00001200 ]이 되는 것입니다.
2
아! 그러고보니 윗 답변이 부분적으로 잘못됐네요.
요즘 나오는 거의 대부분의 CPU에서는
64비트 프로그램에서 mov eax, 0와 같은 32비트 연산을 실행할 경우,
상위 32비트도 0으로 밀어버립니다.
그러니 사실상 mov eax, 0이나 mov rax, 0이나 동일한 명령어 결과물로 만들어버립니다.
그렇게 하는 이유는 mov rax, 0을 하거나 mov eax, 0을 하더라도
동일한 instruction을 만들어서 코드 결과물의 크기를 줄일 수 있기 때문입니다.
1
1
mov eax, 0x1234 을 하기 전에 rax가 0x7ffe9da14d28로 16진수 12자리(6Byte)였는데도 앞의 0x7ffe가 날아가고 0x00001234로 바뀌는 경우는 어떻게 해석하면 좋을까요?