如何编写64位应用程序

如何编写64位应用程序,第1张

64位程序是指在64位 *** 作系统的编写的程序,根使用什么语言没有太多的关系,有些数据类型的位数可能有变化。

64位 *** 作系统是指特别为64位架构计算机系统而设计的 *** 作系统。“位”,简单地理解就是CPU的寻址空间,实际上包括整个计算机系统架构数据处理位数。

用 Visual C++ 创建在 64 位 Windows *** 作系统中运行的应用程序时,应注意以下问题:

在 64 位 Windows *** 作系统中,int 和 long 是 32 位值。

在 64 位 Windows *** 作系统中,size_t、time_t 和 ptrdiff_t 是 64 位值。

在 32 位 Windows *** 作系统中,time_t 是 32 位值。

应注意代码在哪里采用 int 值和将其作为 size_t 值或 time_t 值处理。数字有可能增长得比 32 位数大,并且数据在被传递回 int 存储时有可能被截断。

%x(十六进制 int 格式)printf 修饰符在 64 位 Windows *** 作系统中不按预期的那样工作;它只对传递给它的值的前 32 位进行 *** 作。

Windows 32 位 *** 作系统使用 %I32x 显示整数。

Windows 64 位 *** 作系统使用 %I64x 显示整数。

%p(指针的十六进制格式)在 64 位 Windows *** 作系统中按预期的那样工作。

一、确定在64位 *** 作系统上运行还是在WOW64下运行。

在Visual

Studio平台中最后对64位应用程序编译时,需要指定这个应用程序是在64位 *** 作系统上作为本机应用程序运行还是在WOW64环境下运行。这个

WOW64环境是一个由 *** 作系统提供的兼容性环境。这个环境主要是让32位应用程序也能够在64位的 *** 作系统上运行。换句话说,在编译时要确定产生的应用

程序是真正的64位应用程序(只能够在64位 *** 作系统上运行),还是伪64位应用程序(其实是32位应用程序,只是可以借助WOW64在64位 *** 作系统上

运行)。

在确定这个内容的时候,有一个内容笔者要特别提醒

大家。通常情况下在64位 *** 作系统上,所有使用NET Framework

1.1以前版本生成的应用程序都将被视作为32位应用程序,并且始终在32位公共语言运行上的WOW64环境下运行而在2.0版本以后生成的32位特定

应用程序可以在64位平台上的WOM64环境下运行。这两个版本之间的细微差异,各位读者可以开发一个小程序测试一下即可。其中的内涵是只可意会、不可言

传呀。

二、正确部署Visual Studio开发环境。

在开发64位应用程序之前,需要明白一点。到目前

为止,Visual Studio

2008仍然是一个32位的应用程序。在安装部署时,如果是在X86的计算机上(32位 *** 作系统),则其将安装32位的CLR版本。而如果在64位 *** 作系

统上安装部署时,安装进程将同时安装32位的CLR版本和合适的64位CLR。注意当将其部署到64位 *** 作系统的时候,它将在WOW64环境下运行。

此时笔者认为需要注意一个细节问题。当在

Wom64环境下运行32位应用程序时,应用程序只限于在一个处理器上执行。也就是说应用程序不能够享受64位 *** 作系统所带来的性能上的提升。而单处理器

执行会降低32位应用程序在基于Itanium系统上运行时的性能和可伸缩性。为此如果对于性能要求比较高的应用程序或者有负载比较高的服务器,尽量不要

采用兼容的方式。即32位应用程序在32位 *** 作系统上运行,而不要在Wom64环境下运行。否则的话,不但不能够享受64位 *** 作系统带来的好处,反而会降

低应用程序原有的性能,得不偿失。

三、32位应用程序在64位CLR上运行可能导致意外的结果。

虽然64位 *** 作系统提供另一个WOW64环境,使得32位应用程序能够在64位 *** 作系统上运行。也就是说,在大部分情况下32位应用程序可以在32位或者64位 *** 作系统上同等的运行,其最终的结果都是相同的。但是有时候也会有意外。这些意外主要是以下原因所造成的。

如在应用程序的结构中包含一些大小随平台而改变的成员。如指针类型的对象,其会 *** 作 *** 作系统位数的不同而改变。再如指针算法中如果包含固定大小,或者不正确的平台调用与COM声明等等,都会导致32位应用程序在64位CLR上运行出现一些意外的结果。

为此笔者特别提醒,如果开发人员设计一些兼容的应用程序时(即可以同时在32位与64位应用程序上运行),必须要注意这些因素对应用程序运行过程的影响。在开发中,要尽量避免使用这些对象,以免不必要的麻烦。

四、如何判断某个应用程序是否适合在64位 *** 作程序上运行。

在应用程序开发时,开发人员可能会借鉴已有的应用

程序。此时他们就需要判断手中的应用程序能否在WOW64环境下运行。或者说,只有在特定的平台下,如32位 *** 作系统或者64位 *** 作系统下(而不是

WOM64)下运行。要实现这个目的的话,开发环境提供了一个Corflags的命令。简单的说,在命令行中使用corflags.exe可以确定某个

exe或者dll是仅仅在特定平台上运行,还是只可以在WOW64环境下运行。另外在必要的情况下,程序开发人员还可以利用这个命令来更改应用程序的平台

状态。

五、调试64位应用程序与32位应用程序之间的差异。

在开发平台中自带有应用程序的调试工具。应用程序

调试一般包括本地调试与远程调试。对于一些中大型的应用程序而言,远程调试是必须的。这里需要注意,在任何情况下,如果在64位计算机上安装远程调试都会

同时安装32位和64位版本的远程调试监视器。不过在调试64位应用程序的时候,则必须要选择正确的版本。如需要选择“远程调试器X64)。否则的话,调

试结果会有偏差。

下面介绍一下在64位平台上VS中会出现的编译错误

模块计算机类型“x64”与目标计算机类型“X86”冲突

一种可以解决的方法是:

1、修改目标计算机类型:项目->熟悉->连接器(Linker)->高级->目标计算机。然后把目标计算机类型改成X64。如下图所示:

2、配置管理器:解决方案平台(默认是Win32的)->选择配置管理器->活动解决方案平台下选择x64。如下图所示:

清楚一下项目 重新编译一下 OK!

项目生成64位的应用程序

用汇编写64位程序与32位下有以下几点不同:

1,所用的寄存器不同于32下的eax,ebx,ecx,edx,esi,edi,esp,ebp等,在64位下是rax,rbx,rcx,rdx,rsi,rdi,rsp,rbp,此外又增加了r8,r9,r10,r11,r12,r13,r14,r15等寄存器。但eax,ax,ah,al等依然可用,且增加了spl,bpl等8位寄存器调用,r8等也可以用r8d,r8w,r8b进行32位,16位,8位的调用。

2,函数调用参数传递不同于32下的stdcall规范,而采用fastcall,前四个参数为别放入rcx,rdx,r8,r9四个寄存器中,并在堆栈中留出4*8=32个字节的空间,多于四个的参数放入堆栈。

3,函数调用后,由调用者负责堆栈回收。

看一个例子吧:

include \masm64\inc\user32.inc 头文件

includelib \masm64\lib\user32.lib 库文件

.data 定义数据段

strTittle db "Hello",0

strCaption db "How are you",0

.code 代码段

Main proc 入口过程,需在汇编时定义

sub rsp,28H 为前四个参数预留堆栈空间

xor rcx,rcx 第一个参数0放入rcx中

lea rdx,strCaption 把要显示的字符串地址做为第二个参数放入rdx中

lea r8,strTittle把消息框的标题字符串地址做为第三个参数放入r8中

xor r9,r9把第四个参数0 放入r9中

call MessageBoxA 调用MessageBoxA函数

add rsp,28H 堆栈清理

ret返回

Main ends

end


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11328011.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-15
下一篇 2023-05-15

发表评论

登录后才能评论

评论列表(0条)

保存