日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

VS2019使用NASM编译汇编文件

發布時間:2023/11/30 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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, 1234h
  • ret
  • 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.dll
  • extern _ExitProcess@4 ;in kernel32.dll
  • ?
  • global SayHello
  • global _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",0
  • szMsg:
  • db "Hello World!", 0
  • ?
  • SayHello:
  • push 0 ;uType
  • push dword szTitle ;lpCaption
  • push dword szMsg ;lpText
  • push 0 ;hWnd
  • call _MessageBoxA@16
  • ?
  • ret 16
  • ?
  • _WinMain:
  • call SayHello
  • push 0
  • call _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修改為

  • <EnumValue
  • Name="0"
  • DisplayName="Object File 32"
  • Switch="-f win32" />
  • <EnumValue
  • Name="1"
  • DisplayName="Object File 64"
  • Switch="-f win64" />
  • <EnumValue
  • Name="2"
  • DisplayName="LINUX ELF FORMAT"
  • Switch="-f elf" />
  • <EnumValue
  • Name="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, 1234h
  • ret
  • 純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 ; Constants
  • STD_OUTPUT_HANDLE EQU -11
  • ?
  • extern GetStdHandle ; Import external symbols
  • extern WriteFile ; Windows API functions, not decorated
  • extern ExitProcess
  • ?
  • global main ; Export symbols. The entry point
  • ?
  • section .data ; Initialized data segment
  • Message db "Console Message 64", 0Dh, 0Ah, 0
  • ?
  • section .bss ; Uninitialized data segment
  • alignb 8
  • StandardHandle resq 1
  • Written resq 1
  • ?
  • section .text ; Code segment
  • main:
  • and RSP, 0FFFFFFFFFFFFFFF0h ; Align the stack to a multiple of 16 bytes
  • ?
  • sub RSP, 32 ; 32 bytes of shadow space
  • mov RCX, STD_OUTPUT_HANDLE
  • call GetStdHandle
  • mov qword [REL StandardHandle], RAX
  • add RSP, 32 ; Remove the 32 bytes
  • ?
  • lea RSI, [REL Message]
  • xor RDI, RDI
  • ?
  • .LengthLoop: ; Find the string length by searching for
  • cmp byte [RSI + RDI], 0 ; the null terminator
  • je .LengthDone
  • ?
  • add RDI, 1 ; Maximum length, prevents buffer overrun
  • cmp RDI, 21 ; if there is no null terminator
  • jne .LengthLoop
  • ?
  • .LengthDone:
  • sub RSP, 32 + 8 + 8 ; Shadow space + 5th parameter + align stack
  • ; to a multiple of 16 bytes
  • mov RCX, qword [REL StandardHandle] ; 1st parameter
  • lea RDX, [REL Message] ; 2nd parameter
  • mov R8, RDI ; 3rd parameter
  • lea R9, [REL Written] ; 4th parameter
  • mov qword [RSP + 4 * 8], NULL ; 5th parameter
  • call WriteFile ; Output can be redirect to a file using >
  • add RSP, 48 ; Remove the 48 bytes
  • ?
  • xor RCX, RCX
  • call ExitProcess
  • 總結

    以上是生活随笔為你收集整理的VS2019使用NASM编译汇编文件的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。