https://velog.io/@c4fiber/pintOS-project-2-syscall 을 공부하다가 우연히 FAQ에서 stack alignment에 대한 내용을 봤다.
x86-64 에는 calling convention이 존재한다.
https://en.wikipedia.org/wiki/X86_calling_conventions#System_V_AMD64_ABI
이에 따르면 함수 호출(call) 직전의 stack의 상태에서 rsp의 값이 16의 배수여야 함을 알리고 있다.
alignment는 performance를 위한 권장사항이라고 한다.
(Vol.1 4-1) 프로그램과 자료 구조(특히 stack)의 성능을 위해서 alignment를 수행해야 한다고 나와있다.
(Vol. 3A 6-20) IA-32e mode에서는 stack frame을 생성하기 전 RSP의 16byte alignment를 요구한다
(Vol.1 5-17) 몇몇개의 명령어는 16byte alignment를 강제한다.
그중 하나는 MOVAPS
명령어 이다. 부동소수점 값을 복사하기 위한 명령어인데
XMM 레지스터를 사용하고, 정렬된 4개의 packed floating-point values를 이동시킨다고 나온다.
https://velog.io/@c4fiber/pintOS-project-2-argument-passing 을 수행할 때는 운이 좋았습니다.
테스트를 통과하기 위해서 8bytes 정렬만 고려하고 코드를 작성했는데
이미 RSP+8 의 값이 0x4747FFD0 로 16byte 정렬이 되어있었다.
pintOS에서는 XMM 레지스터를 사용하지 않고, 부동소수점 연산을 지원하지 않습니다.
MOVAPS 같은 부동소숫점 연산 명령어를 사용하지 않으므로 8byte alignment만 수행해도 프로그램에 문제는 없습니다.
Intel® 64 and IA-32 Architectures Software Developer Manuals: https://www.intel.com/content/www/us/en/developer/articles/technical/intel-sdm.html
pintos-kaist document: https://casys-kaist.github.io/pintos-kaist/project2/introduction.html