彙編 子程序與操作系統功能調用

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子程序求出三個雙自變量:dvar1dvar2dvar3的最大公約數並輸出。

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 的程序,演示MessageBoxA16種不同的組態。

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章