我想修改 MSVC 生成的 C++ 代码中的一些汇编代码行。我想这样做的原因可以在这里找到对于高度优化的矩阵乘法代码,MSVC 和 GCC 之间的性能差异 https://stackoverflow.com/questions/21134279/difference-in-performance-between-msvc-and-gcc-for-highly-optimized-matrix-multp
所以我尝试用汇编输出来朗姆酒masm,但它得到了一堆错误。相反,我只是尝试了一个“hello world”示例。
include <stdio.h>
int main() {
printf("asdf\n");
}
使用 /FA /O2 以 64 位模式编译它...请参阅下面的输出
当我运行 ml64 /c Source.asm 时出现以下错误
Source.asm(35) : error A2006:undefined symbol : FLAT
Source.asm(17) : error A2006:undefined symbol : $LN3
Source.asm(18) : error A2006:undefined symbol : $LN3
在花了太多时间之后我发现了这两个线程http://social.microsoft.com/Forums/en-US/e0e541d9-5421-4297-8018-7c6a0f12ae62/compile- assembly- generated-by-cl?forum=whatforum http://social.microsoft.com/Forums/en-US/e0e541d9-5421-4297-8018-7c6a0f12ae62/compile-assembly-generated-by-cl?forum=whatforum and http://social.msdn.microsoft.com/Forums/windowsdesktop/en-US/4aad9e70-6bb8-4622-a5d9-a3b07b51fc7f/c-compiler-creates-assembler-directives-that-ml64-doesnt-understand?forum= Windows SDK http://social.msdn.microsoft.com/Forums/windowsdesktop/en-US/4aad9e70-6bb8-4622-a5d9-a3b07b51fc7f/c-compiler-creates-assembler-directives-that-ml64-doesnt-understand?forum=windowssdk微软说
在使用 Microsoft C/C++ 编译器针对 x64 开展工作之前,我们呼吁不再支持汇编 C/C++ 生成的列表文件。换句话说,列表文件仅供参考。
有人可以解释另一种方法来从 MSVC2012 中的 C++ 代码生成汇编代码,以便我可以修改几行然后重新编译/汇编它吗?
Edit:这里有一些更有用的评论cl.exe 和 ml.exe 的问题 https://stackoverflow.com/questions/7488056/a-problem-with-cl-exe-and-ml-exe/7495413#7495413 and
MS Visual Studio 2010如何使用.asm生成的文件 https://stackoverflow.com/questions/7733091/ms-visual-studio-2010-how-to-use-the-asm-generated-file
这是组装输出
; Listing generated by Microsoft (R) Optimizing Compiler Version 17.00.50727.1
;include listing.inc
INCLUDELIB OLDNAMES
PUBLIC ??_C@_05DBBGCHPA@asdf?6?$AA@ ; `string'
EXTRN __imp_printf:PROC
EXTRN __security_check_cookie:PROC
; COMDAT ??_C@_05DBBGCHPA@asdf?6?$AA@
CONST SEGMENT
??_C@_05DBBGCHPA@asdf?6?$AA@ DB 'asdf', 0aH, 00H ; `string'
CONST ENDS
PUBLIC main
; COMDAT pdata
pdata SEGMENT
$pdata$main DD imagerel $LN4
DD imagerel $LN4+24
DD imagerel $unwind$main
pdata ENDS
; COMDAT xdata
xdata SEGMENT
$unwind$main DD 010401H
DD 04204H
xdata ENDS
; Function compile flags: /Ogtpy
; COMDAT main
_TEXT SEGMENT
main PROC ; COMDAT
; Line 2
$LN4:
sub rsp, 40 ; 00000028H
; Line 3
lea rcx, OFFSET FLAT:??_C@_05DBBGCHPA@asdf?6?$AA@
call QWORD PTR __imp_printf
; Line 4
xor eax, eax
add rsp, 40 ; 00000028H
ret 0
main ENDP
_TEXT ENDS
END