• 汇编语言64位编程

    AMD 和 Intel 64 位处理器的出现增加了对 64 位编程的兴趣。MASM 支持 64 位代码,所有的 Visual Studio 2012 版本(最终版、高级版和专业版)以及桌面系统的 Visual Studio 2012 Express 都会同步安装 64 位版本的汇编器。

    现在借助《数据定义》一节中给出的 AddTwoSum 程序,将其改为 64 位编程:

    ;AddTowSum_64.asm
    
    ExitProcess PROTO
    
    .data
    sum DWORD 0
    
    .code
    main PROC
        mov eax,5
        add eax,6
        mov sum,eax
    
    mov eax,0
        call ExitProcess
    main ENDP
    END

    上述程序与之前给出的 32 位版本不同之处如下所示:

    1) 32 位 AddTwoSum 程序中使用了下列三行代码,而 64 位版本中则没有:

    .386
    .model flat,stdcall
    .stack 4096

    2) 64 位程序中,使用 PROTO 关键字的语句不带参数,如第 3 行代码所示:

    ExitProcess PROTO

    32 位版本代码如下:

    ExitProcess PROTO,dwExitCode:DWORD

    3) 14〜15 行使用了两条指令(mov 和 call)来结束程序。32 位版本则只使用了一条 INVOKE 语句实现同样的功能。64 位 MASM 不支持 INVOKE 伪指令。

    4) 在第 17 行,END 伪指令没有指定程序入口点,而 32 位程序则指定了。

    使用 64 位寄存器

    在某些应用中,可能需要实现超过 32 位的整数的算术运算。在这种情况下,可以使用 64 位寄存器和变量。例如,下述步骤让示例程序能使用 64 位数值:

    • 在第 6 行,定义 sum 变量时,把 DWORD 修改为 QWORD。
    • 在 10〜12 行,把 EAX 替换为其 64 位版本 RAX。

    下面是修改后的 6〜12 行:

    sum DWORD 0

    .code
    main PROC
        mov rax,5
        add rax,6
        mov sum,rax

    编写 32 位还是 64 位汇编程序,很大程度上是个人喜好的问题。但是,需要记住:64 位 MASM 11.0 (Visual Studio 2012 附带的)不支持 INVOKE 伪指令。同时,为了运行 64 位程序,必须使用 64 位Windows。

更多...

加载中...