汇编语言-016(SCASB 、STOSB 、LODSD 、数组中的取值、二维数组操作、冒泡排序和二分查找、CMPSW )
生活随笔
收集整理的這篇文章主要介紹了
汇编语言-016(SCASB 、STOSB 、LODSD 、数组中的取值、二维数组操作、冒泡排序和二分查找、CMPSW )
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1: SCASB : (字節(jié))將AL的值與EDI尋址的一個(gè)字比較。進(jìn)行在一個(gè)字符串檢索特定的字符
.386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.data alpha BYTE "ABCDEFGH",0.code main PROCmov edi,OFFSET alpha ;EDI指向字符串mov al,'F' ;檢索字符Fmov ecx,LENGTHOF alpha ;設(shè)置檢索計(jì)數(shù)器cld ;方向?yàn)檎騬epne scasb ;不相等則重復(fù)jnz quit ;若未發(fā)現(xiàn)字符則退出dec edi ;發(fā)現(xiàn)字符,EDI減1,因?yàn)閳?zhí)行scasb后,edi增加1了quit:INVOKE ExitProcess,0 main ENDP END main2:STOSB : (字節(jié))將AL的值復(fù)制到EDI尋址的位置上,可以加上rep重復(fù)操作
.386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.data Count =100 string1 BYTE Count DUP(?).code main PROCmov al,0FFh ;要保存的數(shù)值mov edi,OFFSET string1 ;EDI指向目標(biāo)字符串mov ecx,Countcldrep stosb ;用AL的內(nèi)容實(shí)現(xiàn)填充INVOKE ExitProcess,0 main ENDP END main3:LODSD : (雙字)交一個(gè)雙字?jǐn)?shù)組中的每個(gè)元素都乘以同一個(gè)常數(shù)
.386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.data array DWORD 1,2,3,4,5,6,7,8,9,10 multiplier DWORD 10 ;將一個(gè)32位整數(shù)數(shù)組中的每個(gè)元素都乘以一個(gè)常數(shù).code main PROCcld mov esi,OFFSET array ;源數(shù)組索引mov edi,esi ;目標(biāo)數(shù)組索引mov ecx,LENGTHOF array ;循環(huán)計(jì)數(shù)器 L1:lodsd ;將[ESI]加載到EAXmul multiplier ;與常數(shù)相乘stosd ;將EAX保存到[EDI]loop L1 INVOKE ExitProcess,0 main ENDP END main4:數(shù)組中的取值,基址——變址操作數(shù),將兩個(gè)寄存器(稱為基址和變址)相加,生成一個(gè)偏移地址
.386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.data array WORD 1000h,2000h,3000h.code main PROCmov ebx,OFFSET arraymov esi,2mov ax,[ebx+esi] ;AX=2000hmov edi,OFFSET arraymov ecx,4mov ax,[edi+ecx] ;AX = 3000hmov ebp,OFFSET arraymov esi,0mov ax,[ebp+esi]INVOKE ExitProcess,0 main ENDP END main5:二維數(shù)組中取值
.386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.data tableB BYTE 10h,20h,30h,40h,50h RowSize = ($ - tableB)BYTE 60h,70h,80h,90h,0A0hBYTE 0B0h,0C0h,0D0h,0E0h,0F0h.code main PROCrow_index = 1column_index = 2mov ebx,OFFSET tableB ;表的偏移量add ebx,RowSize * row_index ;行的偏移量mov esi,column_indexmov al,[ebx+esi] ;AL = 80hINVOKE ExitProcess,0 main ENDP END main6:計(jì)算二維數(shù)組中某一行的之和
.386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.data tableB BYTE 10h,20h,30h,40h,50h RowSize = ($ - tableB)BYTE 60h,70h,80h,90h,0A0hBYTE 0B0h,0C0h,0D0h,0E0h,0F0h.code main PROCrow_index = 1column_index = 2mov ebx,OFFSET tableB ;表的偏移量add ebx,RowSize * row_index ;行的偏移量mov esi,column_indexmov al,[ebx+esi] ;AL = 80hINVOKE ExitProcess,0 main ENDP;計(jì)算字節(jié)矩陣中一行的和數(shù) ;接收:EBX=表偏移量,EAX=行索引 ;ECX=按字節(jié)計(jì)的行大小 ;返回:EAX為和數(shù) calc_row_sum PROC USES ebx ecx edx esimul ecx ;行索引 * 行大小add ebx,eax ;行偏移量mov eax,0 ;累加器mov esi,0 ;列索引 L1:movzx edx,BYTE PTR[ebx + esi] ;取一個(gè)字節(jié)add eax,edx ;與累加器相加inc esi ;行中下一個(gè)字節(jié)loop L1ret calc_row_sum ENDP END main7:二維數(shù)組中使用比例因子尋址取值
.386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.data tableW WORD 10h,20h,30h,40h,50h RowSizeW = ($ - tableW)WORD 60h,70h,80h,90h,0A0hWORD 0B0h,0C0h,0D0h,0E0h,0F0h.code main PROCrow_index = 1column_index = 2mov ebx,OFFSET tableW ;表偏移量add ebx,RowSizeW * row_index ;行偏移量mov esi,column_indexmov ax,[ebx + esi*TYPE tableW] ;AX = 0080hINVOKE ExitProcess,0 main ENDPEND main8:基址——變址——偏移量操作數(shù),用一個(gè)偏移量、一個(gè)基址寄存器、一個(gè)變址寄存器和一個(gè)可選的比例因子生成有效地址
.386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.data tableD DWORD 10h,20h,30h,40h,50h RowSizeD = ($ - tableD)DWORD 60h,70h,80h,90h,0A0hDWORD 0B0h,0C0h,0D0h,0E0h,0F0h.code main PROCrow_index = 1column_index = 2mov ebx,RowSizeD * row_index ;行索引mov esi,column_index ;列索引mov eax,tableD[ebx + esi*TYPE tableD] ;AX = 00000080hINVOKE ExitProcess,0 main ENDPEND main9:64位基址——變址——偏移量操作數(shù)做法
BinarySearch.asm
include BinarySearch.inc.codeBinarySearch PROC USES ebx edx esi edi,pArray:PTR DWORD, ;數(shù)組指針Count:DWORD, ;數(shù)組大小searchVal:DWORD ;給定查找數(shù)值LOCAL first:DWORD,;first的位置last:DWORD, ;last的位置mid:DWORD ;中點(diǎn)mov first,0 ;first = 0mov eax,Count ;last = (Count - 1)dec eaxmov last,eaxmov edi,searchVal ;EDI = searchValmov ebx,pArray ;EBX 為 數(shù)組指針 L1:;當(dāng)first<=last時(shí)mov eax,firstcmp eax,lastjg L5 ;退出查找;mid = (last+first)/2mov eax,lastadd eax,firstshr eax,1mov mid,eax;EDX = values[mid]mov esi,midshl esi,2 ;將mid 值乘4mov edx,[ebx+esi] ;EDX = values[mid];若EDX < searchVal(EDI)cmp edx,edijge L2;first = mid +1mov eax,midinc eaxmov first,eaxjmp L4;否則,若EDX>searchVal(EDI) L2:cmp edx,edijle L3 ;可選項(xiàng);last=mid - 1mov eax,middec eaxmov last,eaxjmp L4;否則返回mid L3:mov eax,mid ;發(fā)現(xiàn)數(shù)值jmp L9 ;返回mid L4: jmp L1 ;繼續(xù)循環(huán) L5:mov eax,-1 ;查找失敗 L9:retBinarySearch ENDPENDBinarySearch.inc
.386 .model flat,stdcall.stack 4096;冒泡排序/對(duì)半查找程序中使用的過程原型;在32位有符號(hào)整數(shù)數(shù)組中查找一個(gè)數(shù) BinarySearch PROTO,pArray:PTR DWORD, ;指向數(shù)組Count:DWORD, ;數(shù)組大小searchVal:DWORD ;查找數(shù)值;用32位有符號(hào)隨機(jī)整數(shù)填充數(shù)組 FillArray PROTO,pArray:PTR DWORD, ;指向數(shù)組Count:DWORD, ;元素個(gè)數(shù)LowerRange:SDWORD, ;隨機(jī)數(shù)的下限UpperRange:SDWORD ;隨機(jī)數(shù)的上限;將32位有符號(hào)整數(shù)數(shù)組定到標(biāo)準(zhǔn)輸出 PrintArray PROTO,pArray:PTR DWORD,Count:DWORD,;將數(shù)組按升序排列 BubbleSort PROTO,pArray:PTR DWORD,Count:DWORDBinarySearchTest.asm
include Irvine32.inc include BinarySearch.incLOWVAL = -5000 ;最小值 HIGHVAL = +5000 ;最大值 ARRAY_SIZE = 50 ;數(shù)組大小.data array DWORD ARRAY_SIZE DUP(?).code main PROCcall Randomize;用有符號(hào)隨機(jī)整數(shù)填充數(shù)組INVOKE FillArray,ADDR array,ARRAY_SIZE,LOWVAL,HIGHVAL;顯示數(shù)組INVOKE PrintArray,ADDR array,ARRAY_SIZEcall WaitMsg;執(zhí)行冒泡排序并再次顯示數(shù)組INVOKE BubbleSort ,ADDR array,ARRAY_SIZEINVOKE PrintArray,ADDR array,ARRAY_SIZE;實(shí)現(xiàn)對(duì)半查找call AskForSearchVal ;用EAX返回INVOKE BinarySearch,ADDR array,ARRAY_SIZE,eaxcall ShowResultsexit main ENDP;請(qǐng)求用戶輸入一個(gè)有符號(hào)整數(shù) ;接收:無 ;返回:EAX = 用戶輸入的數(shù)值 AskForSearchVal PROC .data prompt BYTE "Enter a signed decimal integer "BYTE "in the range of -5000 to +5000 "BYTE "to find in the array: ",0 .codecall Crlfmov edx,OFFSET promptcall WriteStringcall ReadIntret AskForSearchVal ENDP;顯示對(duì)半查找的結(jié)果值 ;接收:EAX = 被顯示數(shù)的位置 ;返回:無 ShowResults PROC .data msg1 BYTE "The value was not found,",0 msg2 BYTE "The value was found at position ",0 .code .IF eax == -1mov edx,OFFSET msg1call WriteString .ELSEmov edx,OFFSET msg2call WriteStringcall WriteDec .ENDIFcall Crlfcall Crlfret ShowResults ENDP END mainBubbleSort.asm
include BinarySearch.inc.code;使用冒泡算法,將一個(gè)32位有符號(hào)整數(shù)數(shù)組升序進(jìn)行排列 ;接收:數(shù)組指針,數(shù)組大小 ;返回:無 BubbleSort PROC USES eax ecx esi,pArray:PTR DWORD, ;數(shù)組指針Count:DWORD ;數(shù)組大小mov ecx,Countdec ecx ;計(jì)數(shù)值減1 L1:push ecx ;保存外循環(huán)計(jì)數(shù)值mov esi,pArray; 指向第一個(gè)數(shù)值 L2:mov eax,[esi] ;取數(shù)組元素值cmp [esi+4],eax ;比較兩個(gè)數(shù)值jg L3 ;如果[ESI]<=[ESI+4],不交換xchg eax,[esi+4];交換兩數(shù)mov [esi],eax L3:add esi,4 ;兩個(gè)指針都向前移動(dòng)一個(gè)元素loop L2 ;內(nèi)循環(huán)pop ecx ;恢復(fù)外循環(huán)計(jì)數(shù)值loop L1 ;若計(jì)數(shù)值不等于0,則繼續(xù)外循環(huán) L4:ret BubbleSort ENDP ENDFillArray.asm
include Irvine32.inc.code ;用LowerRange到(UpperRange-1之間的32位隨機(jī)有符號(hào)整數(shù)序列填充數(shù)組) ;返回:無 FillArray PROC USES eax edi ecx edx,pArray:PTR DWORD, ;數(shù)組指針Count:DWORD, ;元素個(gè)數(shù)LowerRange:SDWORD, ;范圍下限UpperRange:SDWORD ;范圍上限mov edi,pArray ;EDI為數(shù)組指針mov ecx,Count ;循環(huán)計(jì)數(shù)器mov edx,UpperRangesub edx,LowerRange ;EDX = 絕對(duì)范圍0..ncld ;方向標(biāo)志位清零 L1:mov eax,edx ;偏移處理結(jié)果call RandomRangeadd eax,LowerRange ;偏移處理結(jié)果stosd ;將EAX 保存到[edi]loop L1ret FillArray ENDP ENDPrintArray.asm
include Irvine32.inc.code ;將32位有符號(hào)十進(jìn)制整數(shù)數(shù)組寫到標(biāo)準(zhǔn)輸出,數(shù)值用逗號(hào)隔開 ;接收:數(shù)組指針,數(shù)組大小 ;返回:無 PrintArray PROC USES eax ecx edx esi,pArray:PTR DWORD, Count:DWORD .data comma BYTE ", ",0 .codemov esi,pArraymov ecx,Countcld L1:lodsd ;加載[ESI]到EAXcall WriteInt ;發(fā)送到輸出mov edx,OFFSET commacall WriteStringloop L1call Crlfret PrintArray ENDPEND10:CMPSW : 比較兩個(gè)16位數(shù)組,找出第一個(gè)相同的值
.386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwEixtCode:DWORD.data sourceW WORD 1,2,3,4,5 targetW WORD 5,4,3,2,1.code main PROCmov esi,OFFSET sourceWmov edi,OFFSET targetWcldmov ecx,LENGTHOF sourceWrepne cmpswsub esi,TYPE WORDmov ax,[esi]INVOKE ExitProcess,0 main ENDP END main總結(jié)
以上是生活随笔為你收集整理的汇编语言-016(SCASB 、STOSB 、LODSD 、数组中的取值、二维数组操作、冒泡排序和二分查找、CMPSW )的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 丰田汽车多少钱啊?
- 下一篇: 汇编语言-017(SCASW 、STRU