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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

VS 编写 x64 内联汇编

發布時間:2024/7/23 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 VS 编写 x64 内联汇编 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

From:https://www.cnblogs.com/talenth/p/9135626.html

VS 中使用 X64 匯編:https://blog.csdn.net/kingswb/article/details/64108715

?

?

編寫涉及系統特性的一些底層程序,特別是ShellCode,不可避免地要采用直接編寫匯編代碼的方式。

在目標平臺為x86模式時,可以直接使用內聯匯編,這個很多人都比較熟悉了,也非常地方便。

但是當目標平臺為x64時,微軟不再允許直接內聯匯編了。Visual C++ 至今都禁止 x64 編譯模式下使用 __asm 關鍵字內聯匯編。
每次要用匯編的時候都得另外開一個 ASM 文件寫,然后 call 過去。

怎么解決這個問題呢? 一種辦法是改用Intel的編譯器,它仍然支持內聯匯編。

另一種辦法還是用VS了,但是不能內聯,需要把匯編部分單獨寫到一個asm文件里,然后在其它源文件中引用。

我參考了一些網上的說明,在這里把過程寫詳細些,方便自己,也方便他人。

?

主要過程:

?

?

一、在asm文件中單獨編寫功能函數

?

比如要實現一個64位的加法函數,原型如下:

ULONG64?myAdd(ULONG64?u1,ULONG64?u2);

那么新建一個文件,寫入以下內容

.CODEmyAdd PROCadd rcx,rdxmov rax,rcxret myAdd ENDPEND

將以上內容保存為myadd.asm,然后加其加入到工程中。

在其它需要引用該函數的源文件中,添加以下聲明:

#include "stdafx.h" #include <windows.h>//聲明引用外部函數 EXTERN_C ULONG64 myAdd(ULONG64 u1,ULONG64 u2);int _tmain(int argc, _TCHAR* argv[]) {ULONG64 result = myAdd(0x111111111,0x333333333);printf("result = 0x%I64X\n",result);return 0; }

?

二、設置asm文件的生成方式

在asm文件上點擊右鍵,選擇“屬性”:

然后點擊左側的“常規”,“從生成中排除”選擇“否”,“項類型”選擇“自定義生成工具”,然后點擊應用。

此時在“常規”下面就會出現“自定義生成工具”的條目。

點擊它,設置“命令行”為??ml64 /Fo $(IntDir)%(fileName).obj /c %(fileName).asm

設置輸出為?$(IntDir)%(fileName).obj, 該項必須配置,否則VS認為該文件沒有設置輸出就會不處理它,同時它也告訴鏈接器到哪里去找這個obj文件。

上面的?$(IntDir)是一個宏,表示當前生成配置的目錄,比如"x64\Debug"。

經過以上配置之后,asm文件編譯生成的obj文件就會自動生成到相應配置的目錄。

?

三、生成工程

全部配置完成以后,就可以愉快地生成工程了。正常的輸出結果如下:

1>------ 已啟動生成: 項目: testasm, 配置: Release x64 ------ 1>生成啟動時間為 2016/4/10 9:45:36。 1>InitializeBuildStatus: 1> 正在創建“x64\Release\testasm.unsuccessfulbuild”,因為已指定“AlwaysCreate”。 1>CustomBuild: 1> Performing Custom Build Tools 1> Assembling: myAdd.asm 1> Microsoft (R) Macro Assembler (x64) Version 10.00.40219.01 1> Copyright (C) Microsoft Corporation. All rights reserved. 1> 1>ClCompile: 1> stdafx.cpp 1> testasm.cpp 1>Link: 1> 正在生成代碼 1> 已完成代碼的生成 1> testasm.vcxproj -> F:\x64Program\testasm\x64\Release\testasm.exe 1>FinalizeBuildStatus: 1> 正在刪除文件“x64\Release\testasm.unsuccessfulbuild”。 1> 正在對“x64\Release\testasm.lastbuildstate”執行 Touch 任務。 1> 1>生成成功。 1> 1>已用時間 00:00:01.11 ========== 生成: 成功 1 個,失敗 0 個,最新 0 個,跳過 0 個 ==========

?

?

?

?

總結

以上是生活随笔為你收集整理的VS 编写 x64 内联汇编的全部內容,希望文章能夠幫你解決所遇到的問題。

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