匯編語言-014(編寫過程的應用、偽指令LEA、ENTER、LEAVE、LOCAL、遞歸函數、INVOKE、ADDR、PROC偽指令聲明過程)

1:編寫過程,僅用移位和加法,實現任意32位符號數與EAX相乘

include Irvine32.inc.stack 4096
ExitProcess PROTO,dwExitCode:DWORD.code
main PROC mov eax,80mov ebx,53call BitwiseMultiplycall WriteDecINVOKE ExitProcess,0
main ENDP;EAX=被乘數,EBX=乘數
BitwiseMultiply PROCmov edx,0mov ecx,32
L0:shl ebx,1jnc L1push ecxdec ecxpush eaxshl eax,cladd edx,eaxpop eaxpop ecx
L1:loop L0mov eax,edxret
BitwiseMultiply ENDPEND main

2:編寫過程,實現任意兩個大小(但兩個數字節要一樣長)的壓縮十進制數加法

include Irvine32.inc.stack 4096
ExitProcess PROTO,dwExitCode:DWORDbyteSize = 4
.data
packed_1 BYTE 36h,45h,87h,99h
packed_2 BYTE 72h,07h,23h,45h
sum BYTE byteSize+1 DUP(0).code
main PROCmov esi,OFFSET packed_1mov edi,OFFSET packed_2mov edx,OFFSET summov ecx,byteSizecall AddPackedINVOKE ExitProcess,0
main ENDP;ESI 第一個數的指針
;EDI 第二個數的指針
;EDX 和數指針
;ECX 相加的字節數
AddPacked PROCclc
L0:mov al,BYTE PTR[esi]adc al,BYTE PTR[edi]daamov BYTE PTR[edx],alinc esiinc ediinc edxloop L0mov al,0adc al,0mov BYTE PTR[edx],alret
AddPacked ENDP
END main

3:LEA : 偽指令LEA使用

.386
.model flat,stdcall.stack 4096
ExitProcess PROTO,dwExitCode:DWORD.code
main PROCINVOKE ExitProcess,0
main ENDP;void makeArray()
;{
;  char myString[30];
;  for(int i =0;i<30;i++)
;    myString[i]='*';
;}
makeArray PROCpush ebpmov ebp,espsub esp,32   ;myString位于EBP-30的位置,因為會向4字節對齊lea esi,[ebp-30] ;加載myString的地址;mov esi,OFFSET[ebp -30] 報錯,OFFSET只適用編譯時已知地址mov ecx,30    ;循環計數器
L1:mov BYTE PTR[esi],'*' ;填充inc esi    ;下一個元素loop L1   add esp,32 ;刪除數組(恢復ESP)pop ebpret
makeArray ENDP
END main

4:ENTER_LEAVE : ENTER創建一個過程的堆棧幀,LEAVE結束一個過程的堆棧幀

.386
.model flat,stdcall.stack 4096
ExitProcess PROTO,dwExitCode:DWORD.code
main PROCINVOKE ExitProcess,0
main ENDPMySub PROCenter 8,0  ;保留8個字節局部變量;等于;push ebp;mov ebp,esp;sub esp,8  leave;等于;mov esp,ebp;pop ebpret
MySub ENDP
END main

5:LOCAL : 為ENTER和LEAVE的高級版,可以定義局部變量類型與名字,跟在PROC后使用 LOCAL label:type ,…

.386
.model flat,stdcall.stack 4096
ExitProcess PROTO,dwExitCode:DWORD.code
main PROCcall Example1INVOKE ExitProcess,0
main ENDPExample1 PROCLOCAL temp:DWORDmov eax,tempret
Example1 ENDP;生成匯編是下面這樣,可以查看反匯編
;push ebp
;mov ebp,esp
;add esp,0FFFFFFFCh ;ESP加-4
;mov eax,[ebp-4]
;leave
;ret
END main

6:遞歸函數,整數求和

include Irvine32.inc.code
main PROCmov ecx,5  ;計數值=5mov eax,0  ;存放和數call CalcSum;計算和數call WriteDeccall Crlfexit
main ENDPCalcSum PROCcmp ecx,0  ;檢查計數值jz L2      ;若為零則退出add eax,ecx ;否則與和數相加dec ecx    ;計數值遞減call CalcSum;遞歸調用
L2:	ret 
CalcSum ENDP
END main

7:遞歸函數,階乘

include Irvine32.inc.code
main PROCpush 5  ;計算5!call Factorial  ;計算階乘(EAX)call WriteDeccall Crlfexit
main ENDP;計算階乘
;接收:[ebp+8]=n 需計算的數
;返回:eax =n 階乘
Factorial PROCpush ebpmov ebp,espmov eax,[ebp+8] ;獲取Ncmp eax,0ja L1mov eax,1jmp L2L1:dec eaxpush eaxcall Factorial
;每次遞歸調用返回時,都要執行下面的指令
ReturnFact:mov ebx,[ebp+8]mul ebx  ;EDX:EAX = EAX*EBX
L2:pop ebp ;返回EAXret 4  ;清除堆棧
Factorial ENDP
END main

8:INVOKE_ADDR : 調用指令INVOKE 與 地址指令ADDR

.386
.model flat,stdcall.stack
ExitProcess PROTO,dwExitCode:DWORD.data
Array DWORD 20 DUP(?).code
main PROC;INVOKE Swap,ADDR Array,ADDR [Array+4]  ;ADDR只能與INVOKE使用,也能是匯編常數;如果是使用stdcall,匯編器生成下面代碼;push OFFSET Array+4;push OFFSET Array;call SwapINVOKE ExitProcess,0
main ENDPSwap PROCret 
Swap ENDP
END main

9:PROC偽指令聲明過程時,聲明要接收的參數方式

.386
.model flat,stdcall.stack 4096
ExitProcess PROTO,dwExitCode:DWORD.code
main PROCpush 9push 10call AddTwoINVOKE ExitProcess,0
main ENDPAddTwo PROC,val1:DWORD,val2:DWORDmov eax,val1add eax,val2ret
AddTwo ENDP
;匯編器生成代碼。因為是stdcall ret加上8 ,可以查看反匯編
;push ebp
;mov ebp,esp
;mov eax,dword ptr[ebp+8]
;add eax,dword ptr[ebp+0ch]
;leave
;ret 8END main

10:PROC偽指令聲明過程時,聲明要接收的參數方式和局部變量

.386
.model flat,stdcall.stack 4096
ExitProcess PROTO,dwExitCode:DWORD.code
main PROCINVOKE ExitProcess,0
main ENDPRead_File PROC USES eax ebx,pBuffer:PTR BYTELOCAL fileHandle:DWORDmov esi,pBuffermov fileHandle,eaxret
Read_File ENDP
;匯編器生成代碼
;push ebp
;mov ebp,esp
;add esp,0FFFFFFFCh  ;創建fileHandle
;push eax  ;保存eax
;push ebx
;mov esi,dword ptr[ebp+8] ;pBuffer
;mov dword ptr[ebp-4],eax ;fileHandle
;pop ebx
;pop eax
;leave
;ret 4   有一個參數4字節
END main

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

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

相關文章

從鍵盤輸入一個字符,判斷其是不是大寫字母,如果是則請輸出這個大寫字母,如果不是請輸出“這不是一個大寫字母”的英文信息(要求:能連續輸出直到輸出“#”結束)。

從鍵盤輸入一個字符&#xff0c;判斷其是不是大寫字母&#xff0c;如果是則請輸出這個大寫字母&#xff0c;如果不是請輸出“這不是一個大寫字母”的英文信息&#xff08;要求&#xff1a;能連續輸出直到輸出“#”結束&#xff09;。 P155 例4.13 DATA SEGMENT STR DB 0DH,0…

再談angularjs DI(Dependency Injection)

在前面已經介紹了關于angularjs&#xff0c;以及擴展了一些jQuery ui的一些組件為angularjs的directive。在這里應進口007 在上篇留言我們來看看在angularjs中的DI特性。 DI&#xff1a;依賴注入&#xff0c;是一種軟件設計模式&#xff0c;應DIP依賴倒置原則&#xff0c;描述組…

Access sql語句創建表及字段類型

Create TABLE 測試表 ( 文本255 VARCHAR NOT NULL, 文本20 VARCHAR(20) NOT NULL, 日期時間 DATETIME, 數字1 BYTE, 數字2 SMALLINT, 數字4 INTEGER, 布爾 BIT, 自動編號 COUNTER(10, 5) CONSTRAINT PK_TVIPLevel26 PRIMARY KEY, 小數 NUME…

c語言getc函數_C語言中的getc()函數與示例

c語言getc函數C語言中的getc()函數 (getc() function in C) Prototype: 原型&#xff1a; int getc(FILE *filename);Parameters: 參數&#xff1a; FILE *filenameReturn type: int 返回類型&#xff1a; int Use of function: 使用功能&#xff1a; In the file handling…

匯編語言-015(PROC偽指令定義參數方式、EXTERNDEF、INCLUDE 、EXTERN 、INVOKE、PROC、PROTO 、MOVSB 、MOVSD 、CMPSD )

1&#xff1a;使用PROC偽指令定義參數方式不通過寄存器傳參&#xff0c;計算數組之和 .386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.data array DWORD 10000h,20000h,30000h,40000h,50000h theSum DWORD ?.code ArraySum PROC USES esi ecx,ptr…

編寫計算表達式(X-Y+25)/Z的值得程序,要求將其商和余數分別放在A、B單元中。(設X和Y是32位無符號數,A、B和Z是16位無符號數,不考慮溢出情況。)

編寫計算表達式&#xff08;X-Y25&#xff09;/Z的值得程序&#xff0c;要求將其商和余數分別放在A、B單元中。&#xff08;設X和Y是32位無符號數&#xff0c;A、B和Z是16位無符號數&#xff0c;不考慮溢出情況。&#xff09; P151 例4.8 匯編思路&#xff1a;首先在DATA段定…

《深入淺出WPF》筆記——綁定篇(一)

上一節&#xff0c;有記錄寫到&#xff1a;在WPF里&#xff0c;數據驅動UI&#xff0c;數據占核心地位&#xff0c;UI次之。怎么恢復數據的核心地位&#xff0c;那就要先了解一下Binding。 一、Binding 基礎 1.1WPF中Data Binding的帶來的方便 在設計架構的時間&#xff0c;大家…

你的代碼完成了嗎?(之二)——可維護性和規范性

二. 可維護性和規范性 對于代碼來說&#xff0c;這兩個屬性其實是緊密相連的。什么樣的代碼最好維護呢&#xff1f;當然是規范的代碼了。再差的規范也要比沒有規范強得多。 之前做對日項目的時候&#xff0c;日本人對于“規范”這個東西&#xff08;他們稱之為開發規約&#xf…

c語言feof函數_使用示例的C語言中的feof()函數

c語言feof函數C語言中的feof()函數 (feof() function in C) Prototype: 原型&#xff1a; int feof(FILE* filename);Parameters: 參數&#xff1a; FILE *filenameReturn type: int(0 or 1) 返回類型&#xff1a; int(0或1) Use of function: 使用功能&#xff1a; In C l…

5種經典排序算法,每個程序員都應該知道

我的新書《Android App開發入門與實戰》已于2020年8月由人民郵電出版社出版&#xff0c;歡迎購買。點擊進入詳情 有沒有想過當您應用從低到高、從高到低或按字母順序等過濾器時&#xff0c;亞馬遜或任何其他電子商務網站中的產品如何排序&#xff1f;排序算法對于此類網站起著至…

匯編語言-016(SCASB 、STOSB 、LODSD 、數組中的取值、二維數組操作、冒泡排序和二分查找、CMPSW )

1&#xff1a; SCASB : (字節)將AL的值與EDI尋址的一個字比較。進行在一個字符串檢索特定的字符 .386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.data alpha BYTE "ABCDEFGH",0.code main PROCmov edi,OFFSET alpha ;EDI指向字符串mov …

編寫一個匯編語言程序,將字符串Hello World中的全部小寫字母轉換為大寫字母,并存放回原地址處。

編寫一個匯編語言程序&#xff0c;將字符串"Hello World"中的全部小寫字母轉換為大寫字母&#xff0c;并存放回原地址處。 P176 4.10 編程思路&#xff1a;首先DATA段中&#xff0c;定義string存放字符串"Hello World"&#xff0c;LEN為字符串string長度…

在Python中使用OpenCV(CV2)對圖像進行邊緣檢測

Modules used: 使用的模塊&#xff1a; For this, we will use the opencv-python module which provides us various functions to work on images. 為此&#xff0c;我們將使用opencv-python模塊&#xff0c;該模塊為我們提供了處理圖像的各種功能。 Download opencv-pytho…

需保留小數點兩位,但同時不要小數點后多余0的前后臺代碼實現

今天碰到一個需求。關于小數點的處理&#xff0c;看起來非常簡單的事情&#xff0c;卻花了一定時間做了一些試驗。最后簡單總結一下&#xff0c;以便備忘。 需求簡化一下表達是這樣的&#xff1a; 有A、B兩列&#xff0c;A/BC。這3列在數據庫中都以decimal存放。 在應用中&…

匯編語言-017(SCASW 、STRUCT 、STRUCT_ALLPOINTS 、STRUCT_ALIGN 、SYSTEMTIME、UNION 、 STRUCTTEST )

1&#xff1a;SCASW : 在wordArray中掃描16位數值0100h,將匹配元素的偏移量復制到EAX .386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.data wordArray WORD 0500h,0400h,0300h,0200h,0100h.code main PROCmov ax,0100hmov edi,OFFSET wordArraymov …

【筆記】正則表達式[1]

元字符 符號 意思 示范 詳例 \d 任意一個數字 \d{2}-\d{8} 22-12345678 * *前的符號重復任意次數 次數可以為零 \d* 222222222222... 或 2 \s 任意的空白符 全半角空格&#xff0c;tab&#xff0c;換行符 \bhi\b\s\bLucy\b hi Lucy 和*用法相似 次數>1 \d …

編寫一個匯編語言程序,完成以下要求。從BUF單元處定義有10個帶符號字數據:-1,3,24,94,62,72,55,0,-48,99,試找出他們中的最大值和平均值,并以此分別存放至該數據區的后兩個單元

編寫一個匯編語言程序&#xff0c;完成以下要求。從BUF單元處定義有10個帶符號字數據:-1,3,24,94,62,72,55,0,-48,99&#xff0c;試找出他們中的最大值和平均值&#xff0c;并以此分別存放至該數據區的后兩個單元中(假設這10個數的和值不超過16位范圍) P176 4.12 編程思路&am…

prototype 的ajax

原文&#xff1a;http://www.prototypejs.org/learn/introduction-to-ajax]翻 譯&#xff1a;www.ruby-china.cn 站長]Prototype框架提供了非常容易和有意思的方法處理Ajax的調用&#xff0c;同時它也是瀏 覽器安全的 。除了簡單的請求外&#xff0c;這個模塊&#xff08;指pro…

匯編語言-018(FLD 、FST、FSTP、FCHS、FABS 、浮點運算符、浮點比較 )

1&#xff1a;FLD : FPU&#xff08;浮點處理器&#xff09;的加載浮點數到堆棧指令 .386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.data array REAL8 10 DUP(?) dblOne REAL8 234.56 dblTwo REAL8 10.1.code main PROCfld array …

mcq 隊列_MCQ | 基礎知識 免費和開源軟件| 套裝4

mcq 隊列Q1. What do you call the technique of storing encrypted user passwords in Linux? Q1。 您如何稱呼在Linux中存儲加密的用戶密碼的技術&#xff1f; System Password Management 系統密碼管理 Shadow Password 影子密碼 Encrypted Password 加密密碼 None of the…