匯編語言-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;}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/379290.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/379290.shtml
英文地址,請注明出處:http://en.pswp.cn/news/379290.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

kotlin 判斷數字_Kotlin程序檢查數字是偶數還是奇數

kotlin 判斷數字Given a number N, we have to check whether it is EVEN or ODD. 給定數字N &#xff0c;我們必須檢查它是偶數還是奇數 。 Example: 例&#xff1a; Input:N 13Output:"ODD"Input:N 24Output:"EVEN"程序在Kotlin檢查偶數或奇數 (Prog…

微機原理與接口技術(第2版)考點

第一章 1&#xff0c;微型計算機的特點&#xff1a; 功能強、可靠性高價格低廉系統設計靈活&#xff0c;適應性強體積小&#xff0c;重量輕&#xff0c;維護方便 2&#xff0c;微型計算機的硬件組成 微處理器內存儲器I/O接口電路I/O設備系統總線 3&#xff0c;微機的工作過…

搜狗面試筆試一面二面全經歷

09.25 華科西十二教&#xff0c;搜狗招聘筆試&#xff1a; C搜索引擎研發。同時有威盛、烽火兩家筆試&#xff0c;就沒有去。 09.26 華科校內某酒店&#xff0c;搜狗一面&#xff1a; 筆試做的不錯&#xff0c;客觀題錯了3.5&#xff08;20個&#xff09;&#xff0c;后兩個算法…

UltraEdit語法高亮

語法加亮分支位于配置&#xff0d;編輯器顯示之下&#xff0c;允許用戶配置語法加亮選項&#xff1a;語法加亮可以識別預定詞語&#xff0c;并用不同顏色顯示它們。該功能對于程序員來說尤其有用&#xff0c;并且對那些想用不同顏色顯示文檔中詞語的用戶也非常有用。提供二十種…

線性代數 向量長度_用戶定義長度的向量| 使用Python的線性代數

線性代數 向量長度Prerequisite: Defining a vector 先決條件&#xff1a; 定義向量 Linear algebra is the branch of mathematics concerning linear equations by using vector spaces and through matrices. In other words, a vector is a matrix in n-dimensional space…

順序表(代碼、分析、匯編)

目錄&#xff1a;代碼&#xff1a;分析&#xff1a;匯編&#xff1a;代碼&#xff1a; SeqList.h #ifndef _SEQLIST_H_ #define _SEQLIST_H_ typedef void SeqList; //定義鏈表數據類型&#xff0c;void因為要適用不同鏈表數據類型 typedef void SeqListNode; //定義鏈表節…

設有兩個16位整數變量A和B,試編寫完成下述操作的程序。

設有兩個16位整數變量A和B&#xff0c;試編寫完成下述操作的程序。 &#xff08;1&#xff09;若有兩個數中一個是奇數&#xff0c;則將奇數存入A中&#xff0c;偶數存入B中。 &#xff08;2&#xff09;若兩個數均為奇數&#xff0c;則兩數分別減1&#xff0c;并存回原變量中…

棋牌游戲服務器架構: 詳細設計(三) 數據庫設計

主要有3類Database: ServerInfoDB,UserInfoDB和GameDB。 ServerInfoDB主要存儲的是游戲列表的信息,UserInfoDB存儲玩家的全局信息&#xff0c;而GameDB就是積分以及積分變化情況。下面分別加以描述。 1. ServerInfoDB ServerInfoDB主要存儲游戲列表信息。主要有以下幾個表: 1. …

程序開發與性格特征

程序開發與性格特征 引言&#xff1a; 程序員給很多人的印象一般是不善于交際、表情嚴肅、思維緊密、做事認真、沉著冷靜等等。那么這些特征到底和程序開發有沒有關系呢&#xff1f;不同性格的人在團隊開發當中將面臨什么樣的問題以及不同性格的人在團隊開發中又將發揮著什么樣…

匯編語言編寫程序從1加到100要求使用循環結構。

匯編語言編寫程序從1加到100要求使用循環結構。 匯編思路&#xff1a;AX用于存放每次累加的結果—>09998…0 首先&#xff0c;DATA段中定義SUM用來存放結果和&#xff0c;STACK段定義一個200DB類型空間&#xff0c;用來存放數據。CODE段&#xff0c;AX清0&#xff0c;CX賦值…

c語言指針++_C ++此指針| 查找輸出程序| 套裝3

c語言指針Program 1: 程序1&#xff1a; #include <iostream>using namespace std;class Test {int VAL;public:Test(int v){VAL v;}Test* Sum(Test T1, Test T2){VAL T1.VAL T2.VAL;return this;}void print(){cout << VAL << " ";}};int mai…

線性表(代碼、分析、匯編)

目錄&#xff1a;代碼&#xff1a;分析&#xff1a;匯編&#xff1a;代碼&#xff1a; LinkList.h #ifndef _LINKLIST_H_ #define _LINKLIST_H_typedef void LinkList; //定義線性表類型 typedef struct _tag_LinkListNode LinkListNode;//定義線性表節點類型 struct _tag_Li…

WPF 操作 richTextBox

FROM:http://blog.csdn.net/wuzhengqing1/article/details/7010902 取出richTextBox里面的內容 第一種方法&#xff1a; 將richTextBox的內容以字符串的形式取出 string xw System.Windows.Markup.XamlWriter.Save(richTextBox.Document); 第二種方法&#xff1a;將richTe…

微軟企業庫4.1學習筆記(八)創建對象 續集2

3.3通過配置指定和Unity的整合 另外一種方法是在配置源中指定配置的需要&#xff0c;你可以指定下面的一條或者多條&#xff1a; 你可以在Unity配置中指定想要的BlockExtensions  你可以在Unity配置中的type配置節指定如何創建企業庫對象&#xff0c;指定類型映射的關系&…

已知有幾個數據存放在BUF為首址的字節存儲區中,試統計其中正數的個數,并將結果存入ZNUM單元中。

已知有幾個數據存放在BUF為首址的字節存儲區中&#xff0c;試統計其中正數的個數&#xff0c;并將結果存入ZNUM單元中。 P160 例4.17 匯編思路&#xff1a;DATA段&#xff0c;定義BUF存儲區&#xff0c;定義一下DB類型的數據&#xff0c;N為定義數據的總個數&#xff0c;ZNUM…

靜態鏈表(代碼、分析、匯編)

目錄&#xff1a;代碼&#xff1a;分析&#xff1a;匯編&#xff1a;代碼&#xff1a; StaticList.h #ifndef _STATICLIST_H_ #define _STATICLIST_H_typedef void StaticList; //空類型靜態表類型可以接收任何類型的靜態表類型 typedef void StaticListNode;//空類型節點類型…

c語言 typedef_C Typedef-能力傾向問題與解答

c語言 typedefC programming Typedef Aptitude Questions and Answers: In this section you will find C Aptitude Questions and Answers on typedef topics, defining/changing name of any data type, using and accessing the typedef values. C編程Typedef Aptitude問答&…

ios程序 調試log宏的添加

#ifdef DEBUG # define LOG(...) NSLog(__VA_ARGS__) # define LOG_CURRENT_METHOD NSLog("%-%", NSStringFromClass([self class]), NSStringFromSelector(_cmd)) #else # define LOG(...) ; # define LOG_CURRENT_METHOD ; #endif 使用 LOG_CURRENT_METHOD; NS…

Python的線程池實現

代碼 1 #coding:utf-82 3 #Python的線程池實現4 5 importQueue6 importthreading7 importsys8 importtime9 importurllib10 11 #替我們工作的線程池中的線程12 classMyThread(threading.Thread):13 def__init__(self, workQueue, resultQueue,timeout30, **kwargs):14 threadin…

編程統計BUF字單元數據中所含1的個數,并將結果存入COUNT單元中。

編程統計BUF字單元數據中所含1的個數&#xff0c;并將結果存入COUNT單元中。 代碼如下&#xff1a; DATA SEGMENT BUF DW 2345H ;隨機存儲一下數據 COUNT DB ? ;用于統計BUF字單元數據中所含1的個數 DATA ENDS STACK SEGMENT STACKDB 100 DUP(?);在堆棧段開辟一段大小為1…