目录
案例分析
案例一代码
分析
案例二代码
知识补充
bubbleSort proc
;bubbleSort(int *arr,int len) call C style
;input:
;push len
;push offset arrpush ebpmov ebp,esppushadmov edx,[ebp+8]mov ecx,[ebp+12]mov esi,0;i=esisub ecx,1;ecx=n-1
again_1: cmp esi,ecx jge final_1mov edi,0;j=edimov ebx,ecxsub ebx,esi
again_2: cmp edi,ebx;ebx=n-1-i jge final_2mov eax,[edx+4*edi]cmp eax,[edx+4*edi+4]jle nextpush [edx+4*edi+4]pop [edx+4*edi]mov [edx+4*edi+4],eax
next: inc edijmp again_2
final_2: inc esijmp again_1
final_1: popadpop ebpret 8
bubbleSort endpoutput proc
;output(int *arr ,int len)
;input:
;edx=arr
;ecx=lenpushadmov esi,0
again: cmp esi,ecxjge finalmov eax,[edx+4*esi]call writeintmov al,' 'call writecharinc esijmp again
final: popadret
output endp
push len
push offset arr先将长度和首地址进行入栈
push ebp
mov ebp,esp
pushad将ebp进栈方便对len和arr进行寻址,将各寄存器进栈
mov edx,[ebp+8]
mov ecx,[ebp+12]此时edx,ecx分别为arr首地址和长度
进行逻辑运算后
popad
pop ebpret 8
将各寄存器出栈,将ebp出栈,ret 8让栈平衡
void insertionSort( int arr[], int n){
int i;
for(i = 1; i < n; i++) {
insert(arr, i);
}
}void insert ( int arr[], int n){
int key = arr[n];
int i = n;
while (arr[i - 1] > key) {
arr[i] = arr[i-1];
i--;
if(i == 0) break;
}
arr[i] = key;
}
INCLUDE Irvine32.inc
.data
arr dd 99, 2, 3, -11, 22, 88, 7, 77, 547, 717, -54
len dd ($-arr)/4
a dd ?
.code
insert PROC
;arr,a(i)
push ebp
mov ebp,esp
pushad
mov ebx,[ebp+8];ebx=i(n)
mov eax,[ebp+12];eax=arr
mov ecx,[eax+ebx*4];ecx=key
again:
cmp [eax+4*ebx-4],ecx
jle final
mov edx,[eax+4*ebx-4]
mov [eax+4*ebx],edx
sub ebx,1
cmp ebx,0
je final
jmp again
final:mov [eax+4*ebx],ecxpopadpop ebpret 8
insert ENDPmain PROC
mov a,1
again:
mov eax,a;a为下标(eax)
cmp eax,len;(len=n)
jae myout
push offset arr
push a
call insert
add a,1
jmp againmyout:mov ebx,0again2:cmp ebx,lenjae final2mov eax,arr[ebx*4]call WriteIntadd ebx,1jmp again2final2:exit
main ENDP
END main
call crlf