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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

汇编语言-015(PROC伪指令定义参数方式、EXTERNDEF、INCLUDE 、EXTERN 、INVOKE、PROC、PROTO 、MOVSB 、MOVSD 、CMPSD )

發布時間:2023/12/1 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 汇编语言-015(PROC伪指令定义参数方式、EXTERNDEF、INCLUDE 、EXTERN 、INVOKE、PROC、PROTO 、MOVSB 、MOVSD 、CMPSD ) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1:使用PROC偽指令定義參數方式不通過寄存器傳參,計算數組之和

.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,ptrArray:PTR DWORD,szArray:DWORDmov esi,ptrArraymov ecx,szArraymov eax,0cmp ecx,0je L2 L1:add eax,[esi]add esi,4loop L1 L2:ret ArraySum ENDPmain PROCINVOKE ArraySum,ADDR array, ;數組地址LENGTHOF array;元素個數mov theSum,eax;保存和數INVOKE ExitProcess,0 main ENDP END main

2:使用PROC偽指令定義參數方式不通過寄存器傳參,交換兩個值

include Irvine32.incSwap PROTO,pValx:PTR DWORD ,pValy:PTR DWORD .data Array DWORD 10000h,20000h.code main PROC;顯示交換前的數組mov esi,OFFSET Arraymov ecx ,2mov ebx,TYPE Arraycall DumpMemINVOKE Swap,ADDR Array,ADDR[Array + 4]call DumpMemexit main ENDPSwap PROC USES eax esi edi,pValx:PTR DWORD,pValy:PTR DWORDmov esi,pValxmov edi,pValymov eax,[esi]xchg eax,[edi]mov [esi],eaxret Swap ENDP END main

3:EXTERNDEF_INCLUDE : EXTERNDEF和INCLUDE偽指令,跨模塊使用變量和標號

vars.inc

EXTERNDEF count:DWORD , SYM1:ABS

sub1.asm

.386 .model flat,stdcall include vars.incSYM1 = 10 .data count DWORD 0 END

main.asm

.386 .model flat,stdcall .stack 4096 ExitProcess PROTO,dwExitCode:DWORDinclude vars.inc .code main PROCmov count,2000hmov eax,SYM1INVOKE ExitProcess,0 main ENDP END main

4:EXTERN : 用EXTERN偽指令,多模塊編寫過程調用,傳統的使用

ArraySum.asm

;ArraySum過程 include Irvine32.inc.code ;計算32位整數數組之和 ;接收: ; ptrArray ;數組指針 ; arraySize;數組大小(DWORD) ;返回:EAX = 和數 ArraySum PROCptrArray EQU [ebp+8]arraySize EQU [ebp+12]enter 0,0push ecx push esimov eax,0mov esi,ptrArraymov ecx,arraySizecmp ecx,0jle L2 L1:add eax,[esi]add esi,4loop L1 L2:pop esipop ecxleaveret 8 ArraySum ENDP END

DisplaySum.asm

;DisplaySum include Irvine32.inc.code ;在控制臺顯示和數 ;接收: ; ptrPrompt ;提示字符串的偏移量 ; theSum ;數組和數(DWORD) ;返回:無 DisplaySum PROCtheSum EQU [ebp+12]ptrPrompt EQU [ebp+8]enter 0,0push eaxpush edxmov edx,ptrPromptcall WriteStringmov eax,theSumcall WriteIntcall Crlfpop edxpop eaxleaveret 8 DisplaySum ENDP END

PromptForIntegers.asm

;提示整數輸入 include Irvine32.inc.code ;提示用戶為數組輸入整數,并用用戶輸入填充數組 ;接收: ; ptrPrompt:PTR BYTE ;提示信息字符串 ; ptrArray:PTR DWORD ;數組指針 ; arraySize:DWORD ;數組大小 ;返回:無 PromptForIntegers PROCarraySize EQU [ebp+16]ptrArray EQU [ebp+12]ptrPrompt EQU [ebp+8]enter 0,0pushad mov ecx,arraySizecmp ecx,0jle L2mov edx,ptrPromptmov esi,ptrArray L1:call WriteStringcall ReadIntcall Crlfmov [esi],eaxadd esi,4loop L1 L2:popadleaveret 12 PromptForIntegers ENDP END

Startup.asm

;整數求和過程 ;多模塊示例 ;本程序由用戶輸入多個整數 ;將它們存入數組,計算數組之和 ;并顯示和數 include Irvine32.incEXTERN PromptForIntegers@0:PROC EXTERN ArraySum@0:PROC , DisplaySum@0:PROC;為了方便,重新定義外部符號 ArraySum EQU ArraySum@0 PromptForIntegers EQU PromptForIntegers@0 DisplaySum EQU DisplaySum@0 ;修改Count來改變數組大小 Count = 3.data prompt1 BYTE "Enter a signed integers: ",0 prompt2 BYTE "The sum of the integers is: ",0 array DWORD Count DUP(?) sum DWORD ?.code main PROCcall Clrscr;PromptForIntegers(addr prompt1,addr array,Count)push Countpush OFFSET arraypush OFFSET prompt1call PromptForIntegers;sum = ArraySum(addr array,Count)push Countpush OFFSET arraycall ArraySummov sum,eax;DisplaySum(addr prompt2,sum)push sumpush OFFSET prompt2call DisplaySumcall Crlfexit main ENDP END main

5:INVOKE_PROC_PROTO : 使用INVOKE和PROC和PROTO更高級的來進行多模塊編程,相比EXTERN簡化很多細節

arraySum.am

;ArraySum 過程 include sum.inc.code ArraySum PROC,ptrArray:PTR DWORD, ;數組指針arraySize:DWORD ;數組大小 ;計算32位整數數組之和 ;返回:EAX = 和數push ecx push esimov eax,0mov esi,ptrArraymov ecx,arraySizecmp ecx,0jle L2 L1:add eax,[esi]add esi,4loop L1 L2:pop esipop ecxret ArraySum ENDP END

display.asm

;Display過程 include sum.inc.code DisplaySum PROC,ptrPrompt:PTR BYTE, ;提示字符串theSum:DWORD ;數組之和 ; ;在控制臺顯示和數 ;返回:無push eaxpush edxmov edx,ptrPrompt call WriteStringmov eax,theSumcall WriteIntcall Crlfpop edxpop eaxret DisplaySum ENDP END

prompt.asm

;提示整數輸入請求 include sum.inc ;獲取過程.code PromptForIntegers PROC,ptrPrompt:PTR BYTE, ;提示字符串ptrArray:PTR DWORD, ;數組指針arraySize:DWORD ;數組大小;提示用戶輸入數組幸免于難,并用用戶輸入填充數組;返回:無pushad mov ecx,arraySizecmp ecx,0jle L2mov edx,ptrPromptmov esi,ptrArray L1:call WriteStringcall ReadIntcall Crlfmov [esi],eaxadd esi,4loop L1 L2:popadret PromptForIntegers ENDP END

sum.inc

include Irvine32.incPromptForIntegers PROTO,ptrPrompt:PTR BYTE , ;提示字符串ptrArray:PTR DWORD, ;數組指針arraySize:DWORD ;數組大小ArraySum PROTO,ptrArray:PTR DWORD, ;數組指針arraySize:DWORD ;數組大小DisplaySum PROTO,ptrPrompt:PTR BYTE, ;提示字符串theSum:DWORD ;數組之和

sum_main.asm

;整數求和 include sum.inc Count = 3 .data prompt1 BYTE "Enter a signed integers: ",0 prompt2 BYTE "The sum of the integers is: ",0 array DWORD Count DUP(?) sum DWORD ?.code main PROCcall ClrscrINVOKE PromptForIntegers,ADDR prompt1,ADDR array,CountINVOKE ArraySum,ADDR array,Countmov sum,eaxINVOKE DisplaySum,ADDR prompt2,sumcall Crlfexit main ENDP END main

6:使用LOCAL 定義一系列局部變量

.386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.code main PROCcall Proc_1INVOKE ExitProcess,0 main ENDPProc_1 PROCLOCAL pArray:PTR DWORD,buffer[20]:BYTE,pwArray:WORD,myByte:SBYTE,myArray[20]:DWORDret Proc_1 ENDPEND main

7:編寫過程ShowParams,顯示過程參數。顯示被調用過程運行時堆棧中32位參數的地址和十六進制數值 過程接收一個參數,表示顯示參數的個數

include Irvine32.inc.stack 4096 ExitProcess PROTO,dwExitCode:DWORD MySample PROTO ,first:DWORD,second:DWORD,third:DWORD.data outAddr BYTE "Address ",0 outEqule BYTE " = ",0 .code main PROCINVOKE MySample,1234h,5000h,6543hINVOKE ExitProcess,0 main ENDPMySample PROC ,first:DWORD,second:DWORD,third:DWORDparamCount = 3push paramCount ;顯示MySample中的三個參數call ShowParamsret MySample ENDPShowParams PROC arg1 EQU [ebp+8]enter 0,0push ecxpush esipush edxmov ecx,arg1mov esi,[ebp]add esi,8 L1:mov edx,OFFSET outAddrcall WriteStringmov eax,esicall WriteHexmov edx,OFFSET outEqulecall WriteStringmov eax,[esi]call WriteHexcall Crlfadd esi,4loop L1pop edxpop esipop ecxleaveret 4 ShowParams ENDP END main

8:MOVSB : (字節)從ESI的尋址的內存數據復制到EDI尋址的內存位置,加上rep 重復操作

.386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.data string1 BYTE "ABCDEFGHIJKLMN",0 string2 BYTE "abcdefghijklmn",0.code main PROCcld ;清除方向標志位mov esi,OFFSET string1 ;esi 指向源mov edi,OFFSET string2 ;edi 指向目的mov ecx,10 ;計數器為10rep movsb ;傳送10個字節INVOKE ExitProcess,0 main ENDP END main

9:MOVSD : (雙字)從ESI的尋址的內存數據復制到EDI尋址的內存位置,加上rep 重復操作

.386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.data source DWORD 20 DUP(0FFFFFFFFh) target DWORD 20 DUP(?).code main PROCcld ;清除方向標志位mov esi,OFFSET source ;esi 指向源mov edi,OFFSET target ;edi 指向目的mov ecx,LENGTHOF source ;計數器為10rep movsd ;傳送10個字節INVOKE ExitProcess,0 main ENDP END main

10:CMPSD : (雙字)比較ESI指向的內存操作數與EDI指向的內存操作數

.386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwEixtCode:DWORD.data source DWORD 1234h target DWORD 5678h.code main PROCmov esi, OFFSET sourcemov edi,OFFSET targetcldcmpsd ;比較雙字ja L1 ;若source>target則跳轉 L1:mov esi ,OFFSET sourcemov edi,OFFSET targetcldmov ecx , LENGTHOF source ;設置重復計數器repe cmpsd ;相等則重復INVOKE ExitProcess,0 main ENDP END main

總結

以上是生活随笔為你收集整理的汇编语言-015(PROC伪指令定义参数方式、EXTERNDEF、INCLUDE 、EXTERN 、INVOKE、PROC、PROTO 、MOVSB 、MOVSD 、CMPSD )的全部內容,希望文章能夠幫你解決所遇到的問題。

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