32비트 환경에서 64 bits 사이즈 저장/복원 방법 질문 -어셈
글쓴이: yeilho / 작성시간: 금, 2007/03/02 - 2:51오전
안녕하세요.
제가 어셈블러를 잘 모르다 보니 염치불구하고 질문 드립니다.
인텔머신 32비트 리눅스환경에서 64비트 변수를 저장했다가 다시 복원해서 사용하고 싶은데 값이 제대로 복원이 안되는군요.
좀더 자세히 설명하면 리눅스에서 시스템 콜을 중간에 가로채서 나름대로 처리하고 다시 원래 값들을 복원하고 싶습니다. 일반적인 예제는 문제가 없는데, ftruncate64 함수는 2번째 인자가 64비트이다 보니 조금 까다롭네요.
어셈을 잘 모르는 관계로 제 딴에는 그럼 레지스터를 2개 대신 3개 사용하면 되지 않을까 했는데, 잘 안되네요.
아래코드는 CALL64를 부르고나서, 나중에 CALL64가 RESTORE64를 부르는게 주요 골자입니다.
#define CALL64(func) \ push %ebp; \ mov %esp, %ebp; \ REG_SAVE \ push %edx; \ push %ecx; \ push %ebx; \ call func; \ REG_RESTORE64() \ leave #define REG_RESTORE64() \ addl $12, %esp; \ pop %ecx; \ pop %edx; #define REG_SAVE \ push %edx; \ push %ecx;
현재 값을 출력해보면 LOW-ORDER값은 제대로 복원되는데,HIGH-ORDER 값이 제대로 복원되지 않습니다.
혹시 좋은 의견 있으시면 조언 부탁드립니다. 그럼 수고하세요.
일호 <><
Forums:
보존할 때 64비트 레지스터를 그대로 보존하면 될텐데요.
push eax
push ebx
...
pop ebx
pop eax
이렇게 쓰지 말고
push rax
push rbx
...
pop rbx
pop rax
이런식으로 지정하시면 64비트 레지스터가 보존될겁니다.
(x86_64(AMD)기준입니다. IA64(Intel)라면 명령어가 완전히 다르니 저도 말씀드리기 힘들겠네요.)
댓글 달기