1: 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 al,'F' ;檢索字符Fmov ecx,LENGTHOF alpha ;設置檢索計數器cld ;方向為正向repne scasb ;不相等則重復jnz quit ;若未發現字符則退出dec edi ;發現字符,EDI減1,因為執行scasb后,edi增加1了quit:INVOKE ExitProcess,0
main ENDP
END main
2:STOSB : (字節)將AL的值復制到EDI尋址的位置上,可以加上rep重復操作
.386
.model flat,stdcall.stack 4096
ExitProcess PROTO,dwExitCode:DWORD.data
Count =100
string1 BYTE Count DUP(?).code
main PROCmov al,0FFh ;要保存的數值mov edi,OFFSET string1 ;EDI指向目標字符串mov ecx,Countcldrep stosb ;用AL的內容實現填充INVOKE ExitProcess,0
main ENDP
END main
3:LODSD : (雙字)交一個雙字數組中的每個元素都乘以同一個常數
.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 ;將一個32位整數數組中的每個元素都乘以一個常數.code
main PROCcld mov esi,OFFSET array ;源數組索引mov edi,esi ;目標數組索引mov ecx,LENGTHOF array ;循環計數器
L1:lodsd ;將[ESI]加載到EAXmul multiplier ;與常數相乘stosd ;將EAX保存到[EDI]loop L1 INVOKE ExitProcess,0
main ENDP
END main
4:數組中的取值,基址——變址操作數,將兩個寄存器(稱為基址和變址)相加,生成一個偏移地址
.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 main
5:二維數組中取值
.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 main
6:計算二維數組中某一行的之和
.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;計算字節矩陣中一行的和數
;接收:EBX=表偏移量,EAX=行索引
;ECX=按字節計的行大小
;返回:EAX為和數
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] ;取一個字節add eax,edx ;與累加器相加inc esi ;行中下一個字節loop L1ret
calc_row_sum ENDP
END main
7:二維數組中使用比例因子尋址取值
.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 main
8:基址——變址——偏移量操作數,用一個偏移量、一個基址寄存器、一個變址寄存器和一個可選的比例因子生成有效地址
.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 main
9:64位基址——變址——偏移量操作數做法
BinarySearch.asm
include BinarySearch.inc.codeBinarySearch PROC USES ebx edx esi edi,pArray:PTR DWORD, ;數組指針Count:DWORD, ;數組大小searchVal:DWORD ;給定查找數值LOCAL first:DWORD,;first的位置last:DWORD, ;last的位置mid:DWORD ;中點mov first,0 ;first = 0mov eax,Count ;last = (Count - 1)dec eaxmov last,eaxmov edi,searchVal ;EDI = searchValmov ebx,pArray ;EBX 為 數組指針
L1:;當first<=last時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 ;可選項;last=mid - 1mov eax,middec eaxmov last,eaxjmp L4;否則返回mid
L3:mov eax,mid ;發現數值jmp L9 ;返回mid
L4: jmp L1 ;繼續循環
L5:mov eax,-1 ;查找失敗
L9:retBinarySearch ENDPEND
BinarySearch.inc
.386
.model flat,stdcall.stack 4096;冒泡排序/對半查找程序中使用的過程原型;在32位有符號整數數組中查找一個數
BinarySearch PROTO,pArray:PTR DWORD, ;指向數組Count:DWORD, ;數組大小searchVal:DWORD ;查找數值;用32位有符號隨機整數填充數組
FillArray PROTO,pArray:PTR DWORD, ;指向數組Count:DWORD, ;元素個數LowerRange:SDWORD, ;隨機數的下限UpperRange:SDWORD ;隨機數的上限;將32位有符號整數數組定到標準輸出
PrintArray PROTO,pArray:PTR DWORD,Count:DWORD,;將數組按升序排列
BubbleSort PROTO,pArray:PTR DWORD,Count:DWORD
BinarySearchTest.asm
include Irvine32.inc
include BinarySearch.incLOWVAL = -5000 ;最小值
HIGHVAL = +5000 ;最大值
ARRAY_SIZE = 50 ;數組大小.data
array DWORD ARRAY_SIZE DUP(?).code
main PROCcall Randomize;用有符號隨機整數填充數組INVOKE FillArray,ADDR array,ARRAY_SIZE,LOWVAL,HIGHVAL;顯示數組INVOKE PrintArray,ADDR array,ARRAY_SIZEcall WaitMsg;執行冒泡排序并再次顯示數組INVOKE BubbleSort ,ADDR array,ARRAY_SIZEINVOKE PrintArray,ADDR array,ARRAY_SIZE;實現對半查找call AskForSearchVal ;用EAX返回INVOKE BinarySearch,ADDR array,ARRAY_SIZE,eaxcall ShowResultsexit
main ENDP;請求用戶輸入一個有符號整數
;接收:無
;返回:EAX = 用戶輸入的數值
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;顯示對半查找的結果值
;接收:EAX = 被顯示數的位置
;返回:無
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 main
BubbleSort.asm
include BinarySearch.inc.code;使用冒泡算法,將一個32位有符號整數數組升序進行排列
;接收:數組指針,數組大小
;返回:無
BubbleSort PROC USES eax ecx esi,pArray:PTR DWORD, ;數組指針Count:DWORD ;數組大小mov ecx,Countdec ecx ;計數值減1
L1:push ecx ;保存外循環計數值mov esi,pArray; 指向第一個數值
L2:mov eax,[esi] ;取數組元素值cmp [esi+4],eax ;比較兩個數值jg L3 ;如果[ESI]<=[ESI+4],不交換xchg eax,[esi+4];交換兩數mov [esi],eax
L3:add esi,4 ;兩個指針都向前移動一個元素loop L2 ;內循環pop ecx ;恢復外循環計數值loop L1 ;若計數值不等于0,則繼續外循環
L4:ret
BubbleSort ENDP
END
FillArray.asm
include Irvine32.inc.code
;用LowerRange到(UpperRange-1之間的32位隨機有符號整數序列填充數組)
;返回:無
FillArray PROC USES eax edi ecx edx,pArray:PTR DWORD, ;數組指針Count:DWORD, ;元素個數LowerRange:SDWORD, ;范圍下限UpperRange:SDWORD ;范圍上限mov edi,pArray ;EDI為數組指針mov ecx,Count ;循環計數器mov edx,UpperRangesub edx,LowerRange ;EDX = 絕對范圍0..ncld ;方向標志位清零
L1:mov eax,edx ;偏移處理結果call RandomRangeadd eax,LowerRange ;偏移處理結果stosd ;將EAX 保存到[edi]loop L1ret
FillArray ENDP
END
PrintArray.asm
include Irvine32.inc.code
;將32位有符號十進制整數數組寫到標準輸出,數值用逗號隔開
;接收:數組指針,數組大小
;返回:無
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 ;發送到輸出mov edx,OFFSET commacall WriteStringloop L1call Crlfret
PrintArray ENDPEND
10:CMPSW : 比較兩個16位數組,找出第一個相同的值
.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