Windows下的64位汇编与32位汇编有较大的不同。
为了给后来者提供参考,得到高手的指正,我陆续将心得写出。
一、许多高级的伪指令不再被支持
.386
.model flat,stdcall
option casemap:none
.if .endif .while
invoke等等
option nokeyword:<.while> ;检查“.while”是否被支持。如果出现:“A4027 reserved word expected”,则表示不再被支持
二、推荐的网址
开始进行 64 位 Windows 系统编程之前需要了解的所有信息
http://www.microsoft.com/china/MSDN/library/Windev/64bit/issuesx64.mspx?mfr=true
Moving to Windows x64
http://www.ntcore.com/Files/vista_x64.htm
三、基本的开发环境
操作系统:Windows 2003 Advance Server 64 R2
基本汇编软件:masm32 v9r
64位编译器和链接器:Visual Studio 2008 带的ML64 LINK 等等:
Microsoft (R) Macro Assembler (x64) Version 9.00.20706.01
Microsoft (R) Incremental Linker Version 9.00.20706.01
SDK 开发包:
Windows Server 2003 R2 Platform SDK Full Download:5.2.3790.2075.51.PlatformSDK_Svr2003R2_rtm.iso
四、头文件的修改
由于指令长度发生变化,一些头文件(.inc)的定义要修改:
masm32的安装目录是:../完整的WIN32 MASM环境/masm32
我再include目录下建立了两个子目录:
new64:用于64位的头文件
old32:masm32的原有头文件
我在桌面上建了两个批处理文件,用于编译32位和64位程序。
../完整的WIN32 MASM环境/masm32/include/new64
MSG STRUCT
; hwnd DWORD ?
; message DWORD ?
; wParam DWORD ?
; lParam DWORD ?
; time DWORD ?
; pt POINT <>
;
hwnd dq ?
message dd ?
padding1 dd ? ; padding
wParam dq ?
lParam dq ?
time dd ?
pt POINT <>
padding2 dd ? ; padding
MSG ENDS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
WNDCLASSEX STRUCT
; cbSize DWORD ?
; style DWORD ?
; lpfnWndProc DWORD ?
; cbClsExtra DWORD ?
; cbWndExtra DWORD ?
; hInstance DWORD ?
; hIcon DWORD ?
; hCursor DWORD ?
; hbrBackground DWORD ?
; lpszMenuName DWORD ?
; lpszClassName DWORD ?
; hIconSm DWORD ?
cbSize dd ?
style dd ?
lpfnWndProc dq ?
cbClsExtra dd ?
cbWndExtra dd ?
hInstance dq ?
hIcon dq ?
hCursor dq ?
hbrBackground dq ?
lpszMenuName dq ?
lpszClassName dq ?
hIconSm dq ?
WNDCLASSEX ENDS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
WNDCLASSA STRUCT
; style DWORD ?
; lpfnWndProc DWORD ?
; cbClsExtra DWORD ?
; cbWndExtra DWORD ?
; hInstance DWORD ?
; hIcon DWORD ?
; hCursor DWORD ?
; hbrBackground DWORD ?
; lpszMenuName DWORD ?
; lpszClassName DWORD ?
style dd ?
lpfnWndProc dq ?
cbClsExtra dd ?
cbWndExtra dd ?
hInstance dq ?
hIcon dq ?
hCursor dq ?
hbrBackground dq ?
lpszMenuName dq ?
lpszClassName dq ?
WNDCLASSA ENDS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;