本篇文章給大家分享的是有關(guān)x86平臺(tái)轉(zhuǎn)x64平臺(tái)關(guān)于內(nèi)聯(lián)匯編不再支持的解決方法是什么,小編覺(jué)得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說(shuō),跟著小編一起來(lái)看看吧。
創(chuàng)新互聯(lián)建站-專(zhuān)業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性?xún)r(jià)比元寶山網(wǎng)站開(kāi)發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式元寶山網(wǎng)站制作公司更省心,省錢(qián),快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋元寶山地區(qū)。費(fèi)用合理售后完善,十載實(shí)體公司更值得信賴(lài)。
工具:VS2005 編譯器:cl.exe(X86 C/C++) ml64.exe(X64 ASM64)
前提:X86下內(nèi)聯(lián)匯編是嵌在函數(shù)當(dāng)中實(shí)現(xiàn)的
在X86平臺(tái)下,可以輕松的在C/C++代碼中嵌入?yún)R編代碼,稱(chēng)其為“內(nèi)聯(lián)匯編”,使用”__asm{}”語(yǔ)法即可,比較簡(jiǎn)單,這里不做介紹。當(dāng)你在X86平臺(tái)下,由于性能和速度的要求,需要在C/C++代碼中內(nèi)聯(lián)匯編。而當(dāng)你好不容易在X86平臺(tái)下實(shí)現(xiàn)了這些以后,發(fā)現(xiàn)要轉(zhuǎn)到X64平臺(tái)下面,怎么辦(不是說(shuō)在X64下運(yùn)行X86的程序,因?yàn)檫@是肯定可以的,而是說(shuō)從X86工程轉(zhuǎn)到X64工程)?可以兼容的吧?先試試再說(shuō)嘛。
試一試:
然后暴露出匯編中編寫(xiě)好的函數(shù)的接口。
我是這樣暴露我的匯編函數(shù)的:
extern "C" int __stdcall RGB2YUV_ALL(int bmpWidth, int bmpHeight, unsigned char *videoRef, unsigned char*YUVData);
extern "C" int __stdcall RGB2YUV_BLOCK(int bmpWidth, int bmpHeight, unsigned char *videoRef, unsigned char*YUVData, int LargebmpWidth);
如果一切順利的話,主工程就可以使用上面的函數(shù),編譯連接都沒(méi)有問(wèn)題,但是萬(wàn)惡的運(yùn)行時(shí)有錯(cuò),那就得靠你的調(diào)試了!至此,差不多,從X86到X64,從內(nèi)聯(lián)匯編到單獨(dú)的匯編文件,解決了X64下不支持內(nèi)聯(lián)匯編的問(wèn)題啦,嘻嘻。
但是,更加辛苦和耗時(shí)的是匯編代碼的修改和編寫(xiě)、C/C++調(diào)用匯編函數(shù)過(guò)程遇到的種種問(wèn)題,但是只要努力再加上有一定基礎(chǔ)的情況下是搞得定許多問(wèn)題的!
如果你感興趣,或者就是和我一樣碰到這樣的問(wèn)題,下面給出實(shí)例代碼。
1. ASM文件
.data
;數(shù)據(jù)段
.code
FUNC proc
MOV EAX, 1234
RET
FUNC endp
end
2.測(cè)試VS2005控制臺(tái)工程
#include
extern "C" int __stdcall FUNC();
int main(int argc, WCHAR* argv[])
{
int nret = FUNC();
printf(“%d\n”, nret);
system("pause");
return 0;
}
以上就是x86平臺(tái)轉(zhuǎn)x64平臺(tái)關(guān)于內(nèi)聯(lián)匯編不再支持的解決方法是什么,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見(jiàn)到或用到的。希望你能通過(guò)這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。