生活随笔
收集整理的這篇文章主要介紹了
VS2019使用NASM编译汇编文件
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
注意下面第一個方法用到的配置文件只能編譯win32格式的匯編,要是有其他需求自己改配置文件
?
@1:
下載nasm后安裝,在環境變量path中添加其安裝目錄,下載地址http://www.nasm.us/
將下載的三個配置文件放到C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V140\BuildCustomizations文件夾下,ok。下載地址http://download.csdn.net/detail/x356982611/9504205
?
@2:
下面就說下怎么在vs工程中使用:
工程目錄右擊->"工程依賴項"->"生成自定義",然后勾選nasm這一項
在添加的.asm文件上右擊打開屬性
這樣就可以了,F7編譯 -------》通過
另一個要注意的點是,如果是c++工程,一定要用extern “c” 去導入函數
參考文獻?http://www.codeproject.com/Articles/410776/Integrating-a-compiler-assembler-in-VS-Using-NASM
————————————————
原文鏈接:https://blog.csdn.net/x356982611/article/details/51260841
?
?
?
參考了以下兩個博客文章
http://blog.csdn.net/x356982611/article/details/51260841
http://www.cnblogs.com/antoniozhou/archive/2008/10/23/1318287.html
首先到CodeProject下載NASM的VS配置文件
https://www.codeproject.com/Articles/410776/Integrating-a-compiler-assembler-in-VS-Using-NASM
解壓3個配置文件到
C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V140\BuildCustomizations
也就是和masm的配置文件相同的位置
然后把NASM加入到系統環境變量
D:\nasm-2.13.01
新建一個控制臺空工程,同之前MASM的一樣,只不過這次選NASM
http://www.cnblogs.com/kileyi/p/7257852.html
建立1個cpp和1個asm文件
cpp01.cpp
#include <iostream>?extern "C" void nasm_function(void);?void main(){nasm_function();?system("pause");}
asm01.asm
segment .text?global _nasm_function?_nasm_function:mov eax, 1234hret
asm文件上,鼠標右鍵屬性設置
需要注意的一點是,cpp和asm文件要放到NASMTest.vcxproj與.vcproj相同的目錄下才能編譯,不像MASM可以放在任意目錄下,只要把文件添加到
工程就可以編譯,NASM的不行,似乎只能放到根目錄下才有效,原因不明,說不定可以設置,但是我沒找到。
編譯應該就能通過了。
有趣的是MASM可以在ASM匯編代碼上下斷點,而NASM的卻不行。不太清楚怎么回事,不過反正可以在cpp函數前下斷點,也差不了太多。
在cpp中的nasm_function函數處下斷點,單步就能在寄存器中看到eax變成1234了
接下來搞個純ASM的測試
pure01.asm
?
;filename: sayhellon.asm?;cmd> nasm -fcoff -Xvc sayhellon.asm;cmd> link sayhellon.obj?extern _MessageBoxA@16 ;in user32.dllextern _ExitProcess@4 ;in kernel32.dll?global SayHelloglobal _WinMain?[SECTION .drectve info align=8]db " /subsystem:windows"db " /out:sayhellon.exe"db " /defaultlib:kernel32.lib"db " /defaultlib:user32.lib"db " /export:SayHello"db " /entry:WinMain"db " /merge:.rdata=.text",0?[SECTION .text USE32 align=16]szTitle:db "SayHello",0szMsg:db "Hello World!", 0?SayHello:push 0 ;uTypepush dword szTitle ;lpCaptionpush dword szMsg ;lpTextpush 0 ;hWndcall _MessageBoxA@16?ret 16?_WinMain:call SayHellopush 0call _ExitProcess@4
編譯應該就能通過,如果不行,手動設置下工程屬性中的入口函數
============================================================
試了下x64不能編譯,google了一陣發現是命令行參數的問題。要手動修改一下。
參考了以下例子
http://www.davidgrantham.com/
http://www.davidgrantham.com/nasm-console64/
64位命令行是類似這樣調用的
nasm -f win64 ConsoleMessage64.asm -o ConsoleMessage64.obj
打開nasm.xml文件
搜索
Object File
字符串
把原fwin修改為
<EnumValueName="0"DisplayName="Object File 32"Switch="-f win32" /><EnumValueName="1"DisplayName="Object File 64"Switch="-f win64" /><EnumValueName="2"DisplayName="LINUX ELF FORMAT"Switch="-f elf" /><EnumValueName="3"DisplayName="FLAT BINARY"Switch="-f bin" />
這樣在asm文件上右鍵屬性就可以選64位的參數來編譯鏈接了
新的CPP中調用ASM方法如下
CPP部分不變
#include <iostream>?extern "C" void nasm_function(void);?void main(){nasm_function();?system("pause");}
ASM去掉前面的下劃線就行了
segment .text?global nasm_function?nasm_function:mov eax, 1234hret
純ASM如下
[SECTION .drectve info align=8]db " /subsystem:console"db " /defaultlib:kernel32.lib"db " /defaultlib:user32.lib"db " /entry:main"db " /merge:.rdata=.text",0?NULL EQU 0 ; ConstantsSTD_OUTPUT_HANDLE EQU -11?extern GetStdHandle ; Import external symbolsextern WriteFile ; Windows API functions, not decoratedextern ExitProcess?global main ; Export symbols. The entry point?section .data ; Initialized data segmentMessage db "Console Message 64", 0Dh, 0Ah, 0?section .bss ; Uninitialized data segmentalignb 8StandardHandle resq 1Written resq 1?section .text ; Code segmentmain:and RSP, 0FFFFFFFFFFFFFFF0h ; Align the stack to a multiple of 16 bytes?sub RSP, 32 ; 32 bytes of shadow spacemov RCX, STD_OUTPUT_HANDLEcall GetStdHandlemov qword [REL StandardHandle], RAXadd RSP, 32 ; Remove the 32 bytes?lea RSI, [REL Message]xor RDI, RDI?.LengthLoop: ; Find the string length by searching forcmp byte [RSI + RDI], 0 ; the null terminatorje .LengthDone?add RDI, 1 ; Maximum length, prevents buffer overruncmp RDI, 21 ; if there is no null terminatorjne .LengthLoop?.LengthDone:sub RSP, 32 + 8 + 8 ; Shadow space + 5th parameter + align stack; to a multiple of 16 bytesmov RCX, qword [REL StandardHandle] ; 1st parameterlea RDX, [REL Message] ; 2nd parametermov R8, RDI ; 3rd parameterlea R9, [REL Written] ; 4th parametermov qword [RSP + 4 * 8], NULL ; 5th parametercall WriteFile ; Output can be redirect to a file using >add RSP, 48 ; Remove the 48 bytes?xor RCX, RCXcall ExitProcess
總結
以上是生活随笔為你收集整理的VS2019使用NASM编译汇编文件的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。