2014-02-17 15 views
1

부동 소수점 레지스터를 스택에 저장해야합니다.
fsave 명령을 사용하려고했습니다.어셈블리에서 16 바이트 정렬 주소를 얻는 방법

fsave (%esp) 

을하지만 인수 FSAVE로 16 바이트로 정렬 된 주소를 사용
나는 다음을 수행합니다.

% esp에서 주소를 16 바이트로 정렬하는 방법을 알지 못합니다.

+2

주소. – Michael

+0

new = (이전 + 0xF) & (~ 0xF); –

답변

3

사용하는 인텔 스타일 구문 : 16 바이트의 정렬 된 클리어 낮은 4 비트

push ebp    ;save ebp 
    mov  ebp,esp   ;save esp in ebp 
    and  esp,0fffffff0h ;round esp down to 16 byte boundary 
    sub  esp,128   ;allocate multiple of 16 bytes 
+0

이것은 유용한 정보입니다. 만약 당신이 위의'fsave (% esp)'_를 수행하고 있다면, 기존 스택을 덮어 씁니다. stackpointer를 정렬 할 필요가 있지만 여기에도 스택을 할당해야 함을 잊지 마십시오 ... –

+1

코드 예제가 업데이트되었습니다. 내 오래된 문서에 따르면 fsave는 최대 108 바이트를 절약 할 수 있지만 지금은 더 클 수 있습니다. – rcgldr