在VS2008中,把源cpp文件设置成输出汇编文件,输出的汇编文件中有关键字FLAT,ml64汇编器并不认识该关键字。
贴出cpp文件生成的x64 asm文件内容如下:
; Listing generated by Microsoft (R) Optimizing Compiler Version 15.00.21022.08
include listing.inc
INCLUDELIB OLDNAMES
PUBLIC ??_C@_1FM@CLOJACEI@?$AAs?$AAi?$AAz?$AAe?$AAo?$AAf?$AA?5?$AAv?$AAo?$AAi?$AAd?$AA?5?$AA?$CK?$AA?3?$AA?$CF?$AAd?$AA?0?$AA?5?$AAp?$AAM?$AAe?$AAm?$AAo?$AAr?$AAy?$AA?5?$AAv?$AAa?$AAl?$AAu?$AAe?$AA?5@ ; `string'
PUBLIC ??_C@_1DK@KBDHHII@?$AAi?$AAn?$AAp?$AAu?$AAt?$AA?5?$AAa?$AAn?$AAy?$AA?5?$AAc?$AAh?$AAa?$AAr?$AAa?$AAc?$AAt?$AAe?$AAr?$AA?5?$AAt?$AAo?$AA?5?$AAe?$AAx?$AAi?$AAt?$AA?3?$AA?$AA@ ; `string'
PUBLIC ??_C@_15GANGMFKL@?$AA?$CF?$AAs?$AA?$AA@ ; `string'
EXTRN __security_check_cookie:PROC
EXTRN __imp_wprintf:PROC
EXTRN __imp_wscanf_s:PROC
EXTRN __imp_free:PROC
EXTRN __imp_malloc:PROC
; COMDAT ??_C@_15GANGMFKL@?$AA?$CF?$AAs?$AA?$AA@
CONST SEGMENT
??_C@_15GANGMFKL@?$AA?$CF?$AAs?$AA?$AA@ DB '%', 00H, 's', 00H, 00H, 00H ; `string'
CONST ENDS
; COMDAT ??_C@_1DK@KBDHHII@?$AAi?$AAn?$AAp?$AAu?$AAt?$AA?5?$AAa?$AAn?$AAy?$AA?5?$AAc?$AAh?$AAa?$AAr?$AAa?$AAc?$AAt?$AAe?$AAr?$AA?5?$AAt?$AAo?$AA?5?$AAe?$AAx?$AAi?$AAt?$AA?3?$AA?$AA@
CONST SEGMENT
??_C@_1DK@KBDHHII@?$AAi?$AAn?$AAp?$AAu?$AAt?$AA?5?$AAa?$AAn?$AAy?$AA?5?$AAc?$AAh?$AAa?$AAr?$AAa?$AAc?$AAt?$AAe?$AAr?$AA?5?$AAt?$AAo?$AA?5?$AAe?$AAx?$AAi?$AAt?$AA?3?$AA?$AA@ DB 'i'
DB 00H, 'n', 00H, 'p', 00H, 'u', 00H, 't', 00H, ' ', 00H, 'a', 00H
DB 'n', 00H, 'y', 00H, ' ', 00H, 'c', 00H, 'h', 00H, 'a', 00H, 'r'
DB 00H, 'a', 00H, 'c', 00H, 't', 00H, 'e', 00H, 'r', 00H, ' ', 00H
DB 't', 00H, 'o', 00H, ' ', 00H, 'e', 00H, 'x', 00H, 'i', 00H, 't'
DB 00H, ':', 00H, 00H, 00H ; `string'
CONST ENDS
; COMDAT ??_C@_1FM@CLOJACEI@?$AAs?$AAi?$AAz?$AAe?$AAo?$AAf?$AA?5?$AAv?$AAo?$AAi?$AAd?$AA?5?$AA?$CK?$AA?3?$AA?$CF?$AAd?$AA?0?$AA?5?$AAp?$AAM?$AAe?$AAm?$AAo?$AAr?$AAy?$AA?5?$AAv?$AAa?$AAl?$AAu?$AAe?$AA?5@
CONST SEGMENT
??_C@_1FM@CLOJACEI@?$AAs?$AAi?$AAz?$AAe?$AAo?$AAf?$AA?5?$AAv?$AAo?$AAi?$AAd?$AA?5?$AA?$CK?$AA?3?$AA?$CF?$AAd?$AA?0?$AA?5?$AAp?$AAM?$AAe?$AAm?$AAo?$AAr?$AAy?$AA?5?$AAv?$AAa?$AAl?$AAu?$AAe?$AA?5@ DB 's'
DB 00H, 'i', 00H, 'z', 00H, 'e', 00H, 'o', 00H, 'f', 00H, ' ', 00H
DB 'v', 00H, 'o', 00H, 'i', 00H, 'd', 00H, ' ', 00H, '*', 00H, ':'
DB 00H, '%', 00H, 'd', 00H, ',', 00H, ' ', 00H, 'p', 00H, 'M', 00H
DB 'e', 00H, 'm', 00H, 'o', 00H, 'r', 00H, 'y', 00H, ' ', 00H, 'v'
DB 00H, 'a', 00H, 'l', 00H, 'u', 00H, 'e', 00H, ' ', 00H, 'i', 00H
DB 's', 00H, ' ', 00H, '0', 00H, 'x', 00H, '%', 00H, '0', 00H, '1'
DB 00H, '6', 00H, 'p', 00H, '.', 00H, 0dH, 00H, 0aH, 00H, 00H, 00H ; `string'
CONST ENDS
PUBLIC __$ArrayPad$
PUBLIC wmain
EXTRN __GSHandlerCheck:PROC
EXTRN __security_cookie:QWORD
; COMDAT pdata
; File e:\app\vc9\win64test\win64test\win64test.cpp
pdata SEGMENT
$pdata$wmain DD imagerel $LN3
DD imagerel $LN3+129
DD imagerel $unwind$wmain
pdata ENDS
; COMDAT xdata
xdata SEGMENT
$unwind$wmain DD 031b19H
DD 0260109H
DD 03002H
DD imagerel __GSHandlerCheck
DD 0120H
; Function compile flags: /Ogtpy
xdata ENDS
; COMDAT wmain
_TEXT SEGMENT
ReadBuf$ = 32
__$ArrayPad$ = 288
argc$ = 320
argv$ = 328
wmain PROC ; COMDAT
; 8 : {
$LN3:
push rbx
sub rsp, 304 ; 00000130H
mov rax, QWORD PTR __security_cookie
xor rax, rsp
mov QWORD PTR __$ArrayPad$[rsp], rax
; 9 : void * pMemory;
; 10 : TCHAR ReadBuf[128];
; 11 :
; 12 : pMemory = malloc(0x100000);
mov ecx, 1048576 ; 00100000H
call QWORD PTR __imp_malloc
; 13 :
; 14 : _tprintf(_T("sizeof void *:%d, pMemory value is 0x%016p.\r\n"), sizeof(pMemory), pMemory);
lea rcx, OFFSET FLAT:??_C@_1FM@CLOJACEI@?$AAs?$AAi?$AAz?$AAe?$AAo?$AAf?$AA?5?$AAv?$AAo?$AAi?$AAd?$AA?5?$AA?$CK?$AA?3?$AA?$CF?$AAd?$AA?0?$AA?5?$AAp?$AAM?$AAe?$AAm?$AAo?$AAr?$AAy?$AA?5?$AAv?$AAa?$AAl?$AAu?$AAe?$AA?5@
mov edx, 8
mov r8, rax
mov rbx, rax
call QWORD PTR __imp_wprintf
; 15 :
; 16 : free(pMemory);
mov rcx, rbx
call QWORD PTR __imp_free
; 17 :
; 18 : /* Just wait for test purpose */
; 19 : _tprintf(_T("input any character to exit:"));
lea rcx, OFFSET FLAT:??_C@_1DK@KBDHHII@?$AAi?$AAn?$AAp?$AAu?$AAt?$AA?5?$AAa?$AAn?$AAy?$AA?5?$AAc?$AAh?$AAa?$AAr?$AAa?$AAc?$AAt?$AAe?$AAr?$AA?5?$AAt?$AAo?$AA?5?$AAe?$AAx?$AAi?$AAt?$AA?3?$AA?$AA@
call QWORD PTR __imp_wprintf
; 20 : _tscanf_s(_T("%s"), ReadBuf);
lea rdx, QWORD PTR ReadBuf$[rsp]
lea rcx, OFFSET FLAT:??_C@_15GANGMFKL@?$AA?$CF?$AAs?$AA?$AA@
call QWORD PTR __imp_wscanf_s
; 21 :
; 22 : return 0;
xor eax, eax
; 23 : }
mov rcx, QWORD PTR __$ArrayPad$[rsp]
xor rcx, rsp
call __security_check_cookie
add rsp, 304 ; 00000130H
pop rbx
ret 0
wmain ENDP
_TEXT ENDS
END
运行汇编器编译如下:
ml64 /c Win64Test.asm
Microsoft (R) Macro Assembler (x64) Version 9.00.21022.08
Copyright (C) Microsoft Corporation. All rights reserved.
Assembling: Win64Test.asm
Win64Test.asm(87) : error A2006:undefined symbol : FLAT
Win64Test.asm(103) : error A2006:undefined symbol : FLAT
Win64Test.asm(109) : error A2006:undefined symbol : FLAT
Win64Test.asm(46) : error A2006:undefined symbol : $LN3
Win64Test.asm(47) : error A2006:undefined symbol : $LN3
可以看见,ml64汇编器不支持FLAT关键字。另外,从错误输出可以看到,ml64汇编器也不支持后向引用,$LN3符号就是后向引用!