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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

汇编语言-019(汇编程序与c\c++相互调用)

發布時間:2023/12/1 c/c++ 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 汇编语言-019(汇编程序与c\c++相互调用) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1:在C++程序中使用__asm塊插入匯編代碼程序(不能用LENGTHOF與SIZEOF運算符,而是LENGTH和SIZE)

struct Package {long originZip; //4long destinationzip;//4float shippingPrice; //4 };int main(int argcount,char* args[]) {char myChar;bool myBool;short myShort;int myInt;long myLong;float myFloat;double myDouble;Package myPackage;long double myLongDouble;long myLongArray[10];__asm{mov eax, myPackage.destinationzip; mov eax, LENGTH myInt; //1mov eax, LENGTH myLongArray; / 10mov eax, TYPE myChar; //1mov eax, TYPE myBool; //1mov eax, TYPE myShort; //2mov eax, TYPE myInt; //4mov eax, TYPE myLong; //4mov eax, TYPE myFloat;//4mov eax, TYPE myDouble;//8mov eax, TYPE myPackage;//12mov eax, TYPE myLongDouble; //8mov eax, TYPE myLongArray;//4mov eax, SIZE myLong;//4mov eax, SIZE myPackage;//12mov eax, SIZE myLongArray;//40}return 0;}

2:使用c++程序調用匯編模塊,在一個數組中順序查找一個元素

IndexOf.asm

.586 .model flat,CIndexOf PROTO,srchVal:DWORD,arrayPtr:PTR DWORD,count:DWORD.code ;32位整數數組執行線性搜索 ;尋找指定的數值,如果發現匹配數值 ;用EAX返回索引位置,否則返回-1 IndexOf PROC USES ecx esi edi,srchVal:DWORD,arrayPtr:PTR DWORD,count:DWORDNOT_FOUND = -1mov eax,srchVal ;搜索數值mov ecx,count ;數組大小mov esi,arrayPtr;數組指針mov edi,0 ;索引L1:cmp [esi+edi*4],eaxje foundinc ediloop L1notFound:mov eax,NOT_FOUNDjmp exit found:mov eax,ediexit:ret IndexOf ENDPEND

indexOf.h

extern "C" long IndexOf(long n, long array[], unsigned count);

main.cpp

#include <iostream> #include <time.h> #include "indexof.h" using namespace std;int main() {//偽隨機數數填充數組const unsigned ARRAY_SIZE = 100000;const unsigned LOOP_SIZE = 100000;char* boolstr[] = { "false", "true" };long array[ARRAY_SIZE];for (unsigned i = 0; i < ARRAY_SIZE; i++){array[i] = rand();}long searchVal;time_t startTime, endTime;cout << "Enter an integer value to find: ";cin >> searchVal;cout << "Please wait...\n";//測試匯編函數time(&startTime);int count = 0;for (unsigned n = 0; n < LOOP_SIZE; n++)count = IndexOf(searchVal, array, ARRAY_SIZE);bool found = count != -1;time(&endTime);cout << "Elapsed ASM time:" << long(endTime - startTime)<< "seconds . Found = " << boolstr[found] << endl;return 0;}

3: 在c++程序中調用匯編過程,匯編過程又調用C++函數, 實現提示用戶輸入整數,通過移位方式將其與2的冪相乘

ASM.asm

include Irvine32.inc;外部c++函數 askForInteger PROTO C showInt PROTO C,value:SDWORD,outWidth:DWORD newLine PROTO COUT_WIDTH = 8 ENDING_POWER = 10.data intVal DWORD ?.code ;設置文本顏色,并清除控制臺窗口 ;調用Irvine32庫函數 SetTextOutColor PROC C,color:DWORDmov eax,colorcall SetTextColorcall Clrscrret SetTextOutColor ENDP;輸入一個整數n并顯示范圍為N*21次方到N*210次方的乘法表 DisplayTable PROC CINVOKE askForInteger ;調用C++函數mov intVal,eax ;保存整數mov ecx,ENDING_POWER ;循環計數器 L1:push ecx ;保存計數器shl intVal,1 ;乘以2INVOKE showInt,intVal,OUT_WIDTH;等于INVOKE,;push OUT_WIDTH;push intVal;call showInt;add esp,8 C規范主調方一定要恢復棧call Crlfpop ecxloop L1ret DisplayTable ENDP END

main.cpp

#include <iostream> #include <iomanip> using namespace std;extern "C" {//外部ASM過程void DisplayTable();void SetTextOutColor(unsigned color);//局部C++函數int askForInteger();void showInt(int value,int width); }int main() {SetTextOutColor(0x1E); //藍底黃字DisplayTable();return 0; }//提示用戶輸入一個整數 int askForInteger() {int n;cout<<"Enter an integer between 1 and 90,000:";cin>>n;return n; }//按特定寬度顯示一個有符號整數 void showInt(int value,int width) {cout<< setw(width)<<value; }

4: 在匯編程序中調用C標準庫函數printf、scanf(必須從C或C++啟動程序中調用匯編語言代碼)

ASM.asm

.386 .model flat,stdcall .stack 2000printf PROTO C ,format:PTR BYTE,args:VARARG scanf PROTO C , format:PTR BYTE,args:VARARGTAB =9 .data strSingle BYTE "%lf",0 strDouble BYTE "%lf",0formatTwo BYTE "%lf",TAB,"%lf",0dh,0ah,0 Single REAL8 ? Double REAL8 ?.code asmMain PROC CINVOKE scanf,ADDR strSingle,ADDR SingleINVOKE scanf,ADDR strDouble,ADDR Double;傳遞給printf的浮點參數應聲明為REAL8,如果是REAL4,這需要相當的編程技巧INVOKE printf,ADDR formatTwo,Single,Doubleret asmMain ENDP END

main.cpp

#include <iostream> using namespace std; extern "C" void asmMain();int main() {asmMain();return 0; }

5:匯編過程實現一個數組與一個整數相乘,c++程序傳遞數組進行運算

ASM.asm

.586 .model flat,C.code arrayAdd PROC , array:PTR DWORD,count:DWORD,mulNum:DWORDmov esi, arraymov ecx,count L1:mov eax,[esi]mul mulNummov [esi],eaxadd esi,4loop L1ret arrayAdd ENDP END

main.cpp

#include <iostream> using namespace std;extern "C" void arrayAdd(int* array,int count,int mulNum); int array[] = {1,2,3,4,5,6,7,8}; int main() {arrayAdd(array,8,10);for(int i=0;i<8;i++){cout<<array[i];cout<<endl;}return 0; }

6: 編寫匯編子程序,接收數組偏移量和數組大小,子程序返回數組中最長的遞增序列中整數值的個數

ASM.asm

.586 .model flat,C.code GetIncrementalList PROC USES ecx edi ebx esi,array:PTR SDWORD,count:DWORDmov eax,1mov edi,1mov ecx,countdec ecxmov esi,array L0:mov ebx,[esi]cmp ebx,[esi+4]jge L1inc edijmp L2 L1:cmp edi,eaxjbe L2mov eax,edimov edi,1 L2:add esi,4loop L0ret GetIncrementalList ENDP END

main.cpp

#include <iostream> using namespace std;extern "C" int GetIncrementalList(int* array,int count);int array[] ={-5,10,20,14,17,26,42,22,19,-5}; int main() {int n =GetIncrementalList(array,10);return 0; }

7:編寫匯編子程序,接收三個同樣大小的數組,將第二個數組與第三個數組加到第一個數組中

ASM.asm

.586 .model flat,C.code arraysAdd PROC ,array1:PTR DWORD,array2:PTR DWORD,array3 :PTR DWORD,count: DWORDmov ebx,array1mov esi,array2mov edi,array3mov ecx,count L1: mov eax,[esi]add eax,DWORD PTR[edi]mov [ebx],eaxadd esi,4add edi,4add ebx,4loop L1ret arraysAdd ENDP END

main.cpp

#include <iostream> using namespace std;extern "C" void arraysAdd(int* array1,int* array2,int* array3,int count); int array1[10]; int array2[10]={1,2,3,4,5,6,7,8,9,10}; int array3[10]={1,2,3,4,5,6,7,8,9,10}; int main() {arraysAdd(array1,array2,array3,10);for(int i =0;i<10;i++){cout<<array1[i]<<endl;}return 0; }

8:編寫匯編過程實現判斷是一個數是否是一個質數,是返回1否則返回0,C++將數組每個元素進行判斷

isPrimeNumber.asm

.586 .model flat,C.code isPrimeNumber PROC USES ebx ecx edx, number:DWORDmov ebx,2cmp ebx,numberje L2mov ecx,numberjmp Start L0:mov eax,ecxmov edx,0div ebxcmp edx,0je L1inc ebx Start:cmp ebx,ecxjb L0 L2:mov eax,1jmp quit L1:mov eax,0 quit:ret isPrimeNumber ENDP END

main.cpp

#include <iostream> using namespace std;extern "C" int isPrimeNumber(int number);int array[] = {2,3,4,5,6,7,8,9,10,11,12,13,500,967,968}; int main() {for (int i = 0; i < 15; i++){int result = isPrimeNumber(array[i]);if(result)cout<<array[i]<<"is a prime number."<<endl;elsecout<<array[i]<<"is not a prime number."<<endl;}return 0; }

9:編寫匯編過程從一個數組的尾部開始順序查找一個元素,返回其索引否則返回-1

myLastIndexOf.asm

.586 .model flat,C.code ;32位整數數組執行線性搜索 ;尋找指定的數值,如果發現匹配數值 ;用EAX返回索引位置,否則返回-1 myLastIndexOf PROC USES ecx esi edi,srchVal:DWORD,arrayPtr:PTR DWORD,count:DWORDNOT_FOUND = -1mov eax,srchVal ;搜索數值mov ecx,count ;數組大小mov esi,arrayPtr;數組指針lea edi,[ecx - 1] ;索引L1:cmp [esi+edi*4],eaxje founddec ediloop L1notFound:mov eax,NOT_FOUNDjmp exit found:mov eax,ediexit:ret myLastIndexOf ENDPEND

myLastIndexOf.h

extern "C" long myLastIndexOf(long n, long array[], unsigned count);

main.cpp

#include <iostream> #include "myLastIndexOf.h" using namespace std;long array[10] ={1,2,3,4,5,6,7,8,9,10};int main() {int index = myLastIndexOf(3, array, 10);cout<<index;return 0;}

總結

以上是生活随笔為你收集整理的汇编语言-019(汇编程序与c\c++相互调用)的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 在线观看免费国产 | 人人91 | 波多野结衣中文字幕一区二区 | 日韩精品一区二区在线 | 欧美另类在线观看 | 在线欧美激情 | 亚洲一区二区在线电影 | 免费人成又黄又爽又色 | 欧美日韩亚洲在线观看 | 涩涩天堂 | 性欧美最猛 | 干欧美| 久久精品—区二区三区舞蹈 | 黄色wwww | 欧美一级免费视频 | 国产美女久久久久 | 久在线播放 | www国产视频 | 精品少妇久久 | 国产视频久久久久久久 | 欧美三级手机在线观看 | 男操女免费网站 | 精品日韩制服无码久久久久久 | 国产乱淫av麻豆国产 | 日韩一区二区三区在线看 | 美女网站视频在线观看 | 色婷婷一区二区三区 | 51ⅴ精品国产91久久久久久 | 91人妻一区二区三区 | 亚洲av色香蕉一区二区三区 | 国产爆乳无码一区二区麻豆 | 日本在线不卡一区二区 | 亚洲人 女学生 打屁股 得到 | 午夜av在线免费观看 | 极品粉嫩小仙女高潮喷水久久 | 色亚洲成人 | 欧美亚洲精品一区二区 | 国产第20页| 超碰福利在线观看 | 国产精品二区在线 | 国产噜噜噜噜噜久久久久久久久 | 丰满人妻一区二区三区免费视频棣 | 无码熟妇αⅴ人妻又粗又大 | 亚洲一区二区色图 | 日本人の夫妇交换 | 青青草原成人网 | 轻点好疼好大好爽视频 | 国产av无码专区亚洲av毛片搜 | 你懂的欧美 | 日韩69视频 | 人人爽视频 | 成人爱爱免费视频 | 大陆av片 | 黄毛片在线观看 | 国产视频一区二区三区在线播放 | 比利时xxxx性hd极品 | 色婷婷aⅴ一区二区三区 | 加勒比日韩 | 久久99影院 | 在线亚洲+欧美+日本专区 | 亚洲免费观看高清完整 | 亚洲成av人片一区二区梦乃 | 国产夫妻一区 | 越南a级片| 日本人做受免费视频 | www插插 | 久久高清精品 | 亚洲字幕 | av综合在线观看 | 在线成人小视频 | 最近中文字幕在线观看 | 欧美国产中文字幕 | 久热国产在线 | 国产夫绿帽单男3p精品视频 | 色欲人妻综合网 | 欧美日韩天堂 | 国产免费一区二区三区网站免费 | 久草网在线| 91日批| 色日韩| av高清在线观看 | 久久精品一区二区 | 青青草久久 | 亚洲免费视频播放 | 久久七| 五月天综合在线 | 国产精品亚洲色图 | 中出 在线 | 亚洲精品乱码久久久久久9色 | 高潮一区二区三区 | 日本高清免费不卡视频 | 久久不射影院 | 色姑娘久| 男人插女人下面视频 | 国产超级av | 中文字幕在线视频观看 | 国产精品.com | 亚洲综合一区中 | 在线一区二区三区四区五区 |