冒泡排序的过程 _procSortNum 来自网上;
他原来的程序里有5个数字,排序后输出如下;
下面改动一下程序;数组值加几个看一下情况;然后把排序结果赋值给一个静态文本框;
mysort.asm;
.386
.model flat, stdcall
option casemap :none
include windows.inc
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib
ICO_MAIN equ 1000
DLG_MAIN equ 100
IDC_INFO equ 101
.data
array DWORD 12, 8, -55, 7, 100, -3, 57, 92
arraryLength DWORD ($ - offset array) / 4
szbuf db 500 dup(0)
.data?
hInstance dd ?
hWinMain dd ?
.const
fmt1 db '%d, %d, %d, %d, %d, %d, %d, %d',0dh,0ah,0
.code
_procSortNum proc uses eax edx esi edi, pArray: PTR DWORD, dwArrayNum:DWORD
LOCAL @tmpNum:DWORD
LOCAL @indexStep:DWORD
LOCAL @indexNum:DWORD
mov @indexStep, 0
jmp STEPCMPOUT
LOOPSTEPOUT:
add @indexStep, 1
STEPCMPOUT:
mov eax, dwArrayNum
cmp @indexStep, eax
jg RETURN
mov eax, dwArrayNum
dec eax
mov @indexNum, eax
jmp STEPCMPIN
LOOPSTEPIN:
dec @indexNum
STEPCMPIN:
mov eax, @indexStep
inc eax
mov edx, @indexNum
cmp edx, eax
jl LOOPSTEPOUT
mov esi, pArray
mov edi, pArray
mov eax, @indexNum
mov edx, sizeof(DWORD)
mul edx
add esi, eax
sub eax, sizeof(DWORD)
add edi, eax
mov eax, [esi]
cmp eax, [edi]
jge LOOPSTEPIN
mov eax, [edi]
mov @tmpNum, eax
mov eax, [esi]
mov [edi], eax
mov eax, @tmpNum
mov [esi], eax
jmp LOOPSTEPIN
jmp LOOPSTEPOUT
RETURN:
ret
_procSortNum endp
_ProcDlgMain proc uses ebx edi esi hWnd,wMsg,wParam,lParam
LOCAL @num1:DWORD
LOCAL @num2:DWORD
LOCAL @num3:DWORD
LOCAL @num4:DWORD
LOCAL @num5:DWORD
LOCAL @num6:DWORD
LOCAL @num7:DWORD
LOCAL @num8:DWORD
mov eax,wMsg
.if eax == WM_CLOSE
invoke EndDialog,hWnd,NULL
.elseif eax == WM_INITDIALOG
push hWnd
pop hWinMain
invoke LoadIcon,hInstance,ICO_MAIN
invoke SendMessage,hWnd,WM_SETICON,ICON_BIG,eax
invoke _procSortNum, addr array, arraryLength
mov esi, offset array
mov eax, [esi]
mov @num1, eax
mov eax, [esi + sizeof(DWORD)]
mov @num2, eax
mov eax, [esi + sizeof(DWORD) * 2]
mov @num3, eax
mov eax, [esi + sizeof(DWORD) * 3]
mov @num4, eax
mov eax, [esi + sizeof(DWORD) * 4]
mov @num5, eax
mov eax, [esi + sizeof(DWORD) * 5]
mov @num6, eax
mov eax, [esi + sizeof(DWORD) * 6]
mov @num7, eax
mov eax, [esi + sizeof(DWORD) * 7]
mov @num8, eax
invoke wsprintf,addr szbuf,addr fmt1,@num1,@num2,@num3,@num4,@num5,@num6,@num7,@num8
invoke SetDlgItemText,hWinMain,IDC_INFO,addr szbuf
.else
mov eax,FALSE
ret
.endif
mov eax,TRUE
ret
_ProcDlgMain endp
start:
invoke GetModuleHandle,NULL
mov hInstance,eax
invoke DialogBoxParam,hInstance,DLG_MAIN,NULL,offset _ProcDlgMain,NULL
invoke ExitProcess,NULL
end start
mysort.rc;
#include <resource.h>
#define ICO_MAIN 1000
#define DLG_MAIN 100
#define IDC_INFO 101
ICO_MAIN ICON "Main.ico"
DLG_MAIN DIALOG 188, 193, 140, 75
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "冒泡排序"
FONT 9, "宋体"
{
LTEXT "", IDC_INFO, 6, 6, 135, 65
}
运行如下;
LOCAL @num8:DWORD
加 LOCAL 是定义过程的局部变量,局部变量名前面一般加@,类型为DWORD;
arraryLength DWORD ($ - offset array) / 4
“$”是汇编语言中的一个预定义符号,等价于当前正汇编到的段的当前偏移值;
例如,指令“jmp $+3”中的“$”表示当前这条指令在代码段中的偏移量;