1.編寫一個求n!的子程序,利用它求1!+2! +3! +4! +5! +6! 的和並輸出。
要求參數的傳遞分別採用:寄存器傳遞、全局變量傳遞,堆棧傳遞三種不同的方法實現。
1,2使用寄存器傳遞,3,4使用全局變量,5,6使用堆棧
include vcIO.inc
.data
frmStr byte ' %5d',10,0
result dword ?
param dword ?
.code
main proc
;寄存器
mov eax,1
call factorialbyregister
xor ebx,ebx
add ebx,eax
mov eax,2
call factorialbyregister
add ebx,eax
;變量
mov param,3
call factorialbyparam
add ebx,result
mov param,4
call factorialbyparam
add ebx,result
;堆棧
push 5
call factorialbystack
pop ecx
add ebx,eax
push 6
call factorialbystack
pop ecx
add ebx,eax
pushad
invoke printf,offset frmStr,ebx
popad
pushad
invoke _getch
popad
ret
factorialbyparam proc
mov eax,param
mov ecx,eax
mov eax,1
again:
mul ecx
loop again
mov result,eax
factorialbyparam endp
ret
factorialbyregister proc
mov ecx,eax
mov eax,1
again:
mul ecx
loop again
factorialbyregister endp
ret
factorialbystack proc
push ebp
mov ebp,esp
mov eax,[ebp+8]
mov ecx,eax
mov eax,1
again:
mul ecx
loop again
pop ebp
ret
factorialbystack endp
main endp
end main
2.編程寫一個名爲Gcd的求兩個數最大公約數子程序,主子程序間的參數傳遞通過堆棧完成。調用Gcd子程序求出三個雙自變量:dvar1、dvar2與dvar3的最大公約數並輸出。
include vcIO.inc
.data
frmStr byte "gcd: %d",10,0
dvar1 dword 28
dvar2 dword 56
dvar3 dword 98
.code
main proc
push dvar1
push dvar2
call gcd
pop ebx
pop ebx
push eax
push dvar3
call gcd
pop ebx
pop ebx
pushad
invoke printf,offset frmStr,eax
popad
pushad
invoke _getch
popad
gcd proc
push ebp
mov ebp,esp
mov eax,[ebp+8]
mov ebx,[ebp+12]
.if eax<ebx
xchg eax,ebx
.endif
.while ebx!=0
xor edx,edx
div ebx
mov eax,edx
xchg eax,ebx
.endw
pop ebp
ret
gcd endp
ret
main endp
end main
3.編程寫一個名爲Bubble的冒泡排序子程序,主子程序間的參數傳遞通過堆棧完成
include vcIO.inc
.data
array dword 12,4, 168,122,-33,56,78,99,345, 66,-5
strfrm byte " %d",10,0
.code
main proc
push offset array
mov eax,(lengthof array-1)
push eax
call mybubblesort
pop eax
pop eax
mov eax,(lengthof array)
mov esi,offset array
.while eax>0
pushad
mov ebx,[esi]
invoke printf, offset strfrm,ebx
popad
add esi,4
dec eax
.endw
pushad
invoke _getch
popad
ret
mybubblesort proc
push ebp
mov ebp,esp
mov ecx,[ebp+8]
.while ecx>0
mov esi,[ebp+12]
mov ebx,ecx
.while ebx>0
mov eax,[esi]
mov edx,[esi+4]
.if eax>edx
mov [esi],edx
mov [esi+4],eax
.endif
add esi,4
dec ebx
.endw
dec ecx
.endw
pop ebp
ret
mybubblesort endp
main endp
end main
5.編寫一個調用Windows API 的程序,演示MessageBoxA的16種不同的組態。
include vcIO.inc
MessageBoxA PROTO,
hwnd:DWORD,
lpText:DWORD,
lpCaption:DWORD,
uType:DWORD
ExitProcess PROTO,
dwExitCode:DWORD
.data
msg byte "hello, gensokyo",10, 0
.code
main proc
;push 0h
;push 1h
;push 2h
;push 3h
;push 4h
;push 5h
;push 6h
;push 10h
push 20h
;push 30h
;push 40h
;push 1000h
;push 2000h
mov eax,offset msg
push 0h
push eax
push 0h
call MessageBoxA
pushad
invoke _getch
popad
ret
main endp
end main