yuchi's Development Home


x64 어셈블리 쓰기

조회 수 4821 추천 수 89 2007.04.15 03:00:26
예전에 어셈블리로 떡 쳐놓은게 64비트 포팅에 상당한 걸림돌이 되고 있다.

어셈코드들을 c코드로 다시 짜고는 있으나, 어쩔수 없이 어셈으로 짰던 코드들은 꽤 골치아팠다.

그 중 하나가 가변인자 처리였다.

엔진의 파일 시스템에서 지원하는 fscanf()함수는 팩킹된 파일인지 일반 파일인지에 따라 자체파싱을 하거나 C런타임 라이브러리의 fscanf()를 호출한다.

팩 파일에서 읽는 경우는 메모리에 읽은 후에 자체적으로 만든 sscanf()로 파싱한다. 뭐 기능상 약간 제약은 있지만 별 탈은 없다.

문제는 c런타임라이브러리의 fscanf()를 사용할 경우다.

전에는 간단하게 어셈코드로 짜서 인자를 쉽게 넘겼다.

그런데 x64에선 인라인 어셈을 허용하지 않는데다 , 어차피 기존 32비트 어셈코드는 쓸 수 없었다. 그래서 순수하게 c로 짜려고 했으나....

C만 가지고는 가변인자를 받은 상태 그대로 넘길 방법이 없었다.

외부에서 받은 가변인자 리스트로 fscanf()를 호출하려면 vfscanf()란 놈을 사용해야한다.

늘상 사용하는 c런타임 라이브러리의 fscanf()도 내부적으로 vfscanf()를 호출하는 것을 확인했다.

문제는 vfscanf()는 시스템 내부에서만 사용하고 유져모드에서 사용할 방법이 없다는 것이다.

핼프를 열심히 뒤져보니 posix에선 표준이지만 윈도우에선 지원하지 않는다는 내용을 찾아볼 수 있었다.

고민고민 끝에 x64,x86모두 어셈으로 짜기로 했다.

x86은 인라인으로 짜도 되니까 간단한데, x64는 masm으로 짜야하니 좀 쉽지 않았다. masm문법에 익숙하지 않은건 둘째치고 이놈을 vs2005.net이랑 연동시키는 것부터가 문제였다.

커스텀 빌드를 수동으로 세팅하는 방법은 알고 있었으나, 운좋게도 2005에선 좀더 쉽게 할 수 있는 방법이 있었다.

빌드 rule파일을 이용하는 것인다.

asm파일의 경우는 이미 ml.exe로 링크되어있다. 하지만 내가 하려는건 x64어셈이니까.

기본적으로 포함된 masm.rule파일을 고쳐서 ml64.exe에 연결시키도록 했다.

그 다음은 x64에서 스택 프레임이 어떻게 잡히는지가 문제였는데 꼬박 하룻동안 고민했다. 문서를 열심히 뒤지고 디스어셈블 하고 삽질 끝에 calling convention과 스택프레임이 대해서 깨달음을 얻었다.

대충 그런 내용인데 결과적으로 얻은 것은 다음과 같다.

1.x64에서 스택 구조
2.x64에서 함수 콜링 컨벤션
3.x64레지스터 사용 규약
4.vs2005.net에서 masm사용하기

참고로...인텔 컴파일러를 사용하면 x64플랫폼에서도 인라인 어셈을 쓸 수 있다. 좀 찜찜한것도 있고 masm은 제대로 익혀보고 싶었으니까 그냥 asm파일로 작성했다.

수학함수 포팅할땐 어쩌면 인텔 컴파일러를 사용할지도 모르겠다.

x64 어셈에 관심있는 분들이 계실까 해서 엔진에 적용하기 전에 테스트한 코드를 첨부했다.

또한 함께 사용한 rule파일도 첨부했다.

masm64.rule 파일을 Microsoft Visual Studio 8\VC\VCProjectDefaults\
폴더에다 넣으면 된다. 그리고 나서 비졀씨에서 asm파일을 불러오면 masm64에 연결하겠냐고 물어볼 것이다.

행인

2007.04.17 09:01:55
*.255.241.148

예전에 마이크로소프트웨어지 보니까 인텔의 64비트 어셈블리 코드와 AMD의 64비트 어셈블리코드가 달라서 C/C++로 프로그래밍해야 된다고 나와있던데
어셈블리코드로 호환성있게 작성하는 방법이 있나요?

여치

2007.04.17 09:58:01
*.202.18.85

x64랑 IA64랑 호환이 안되니 따로 짜야겠죠. 현재는 거의 x64가 표준이라고 생각해도 될 듯 합니다. 인텔의 제품군 대부분도 x64거든요.
List of Articles
번호 제목 글쓴이 날짜 조회 수
61 엔진 64비트 포팅 프로젝트 진척상황 여치 2007-05-01 3451
» x64 어셈블리 쓰기 file [2] 여치 2007-04-15 4821
59 64비트 포팅 프로젝트 진척상황 여치 2007-04-07 2977
58 새로 만든 서버용 네트웍 컴포넌트 I4DyuchiNET2.0 file [2] 여치 2007-04-01 3228
57 64비트로 gogo file 여치 2007-03-27 3424
56 하나의 엔진, 멀티 씬그래프 file [1] 여치 2007-03-20 4284
55 라이트맵에 사용한 블러링 file 여치 2007-01-09 3890
54 라이트맵 블러링 추가 file [1] 여치 2007-01-06 4105
53 라이트맵 계산 코드 최적화 여치 2007-01-03 6091
52 라이트맵 텍스쳐 좌표 생성 코드 개선 file [1] 여치 2006-12-31 14208
51 왕창 갈아엎은 라이트맵 file [2] 여치 2006-12-30 4299
50 KGC2006강연자료 - BSP/PORTAL을 이용한 공간분할 및 컬링기법 file [1] 여치 2006-12-03 3931
49 BSP/PORTAL을 이용한 공간분할 file [3] 여치 2006-10-01 4115
48 라이트맵 file 여치 2006-10-01 4200
47 프로토타입용 첫번째 건물의 bsp매쉬 file [1] 여치 2006-05-12 3786
46 맵툴 및 새로운 BSP/PORTAL시스템 진행상황 file 여치 2006-03-21 3930
45 모델링 가능한 맵툴, 현재까지 진행상황 file 여치 2006-02-28 3662
44 모델링 가능한 맵툴만들기 #1 - boolean 연산 file 여치 2006-01-11 4487
43 요새 관심사는... [2] 여치 2006-01-10 3262
42 x64 어셈을 쓰기 위해 몇 가지 찾아본 결과(현재까지 경과) 여치 2005-12-09 7548
天安門大屠殺 六四天安門事件 反右派鬥爭 大躍進政策 文化大革命 六四天安門事件 The Tiananmen Square protests of 1989 天安門大屠殺 The Tiananmen Square Massacre 反右派鬥爭 The Anti-Rightist Struggle 大躍進政策 The Great Leap Forward 文化大革命 The Great Proletarian Cultural Revolution 人權 Human Rights 民運 Democratization 自由 Freedom 獨立 Independence 多黨制 Multi-party system 民主 言論 思想 反共 反革命 抗議 運動 騷亂 暴亂 騷擾 擾亂 抗暴 平反 維權 示威游行 法輪功 Falun Dafa 李洪志 法輪大法 大法弟子 強制斷種 強制堕胎 民族淨化 人體實驗 胡耀邦 趙紫陽 魏京生 王丹 還政於民 和平演變 激流中國 北京之春 大紀元時報 九評論共産黨 獨裁 專制 壓制 統一 監視 鎮壓 迫害 侵略 掠奪 破壞 拷問 屠殺 肅清 活摘器官 障テ社會 誘拐 買賣人口 遊進 走私 毒品 賣淫 春畫 賭博 六合彩 台灣 臺灣 Taiwan Formosa 中華民國 Republic of China 西藏 土伯特 唐古特 Tibet 達償ワ喇嘛 Dalai Lama 新疆維吾爾自治區 The Xinjiang Uyghur Autonomous Region free tibet



XE Login

天安門大屠殺 六四天安門事件 反右派鬥爭 大躍進政策 文化大革命 六四天安門事件 The Tiananmen Square protests of 1989 天安門大屠殺 The Tiananmen Square Massacre 反右派鬥爭 The Anti-Rightist Struggle 大躍進政策 The Great Leap Forward 文化大革命 The Great Proletarian Cultural Revolution 人權 Human Rights 民運 Democratization 自由 Freedom 獨立 Independence 多黨制 Multi-party system 民主 言論 思想 反共 反革命 抗議 運動 騷亂 暴亂 騷擾 擾亂 抗暴 平反 維權 示威游行 法輪功 Falun Dafa 李洪志 法輪大法 大法弟子 強制斷種 強制堕胎 民族淨化 人體實驗 胡耀邦 趙紫陽 魏京生 王丹 還政於民 和平演變 激流中國 北京之春 大紀元時報 九評論共産黨 獨裁 專制 壓制 統一 監視 鎮壓 迫害 侵略 掠奪 破壞 拷問 屠殺 肅清 活摘器官 障テ社會 誘拐 買賣人口 遊進 走私 毒品 賣淫 春畫 賭博 六合彩 台灣 臺灣 Taiwan Formosa 中華民國 Republic of China 西藏 土伯特 唐古特 Tibet 達償ワ喇嘛 Dalai Lama 新疆維吾爾自治區 The Xinjiang Uyghur Autonomous Region free tibet