Giúp bài tập lập trình assembly qua masm32

Giúp mình câu này vs, lập trình assembly qua masm32. Cho mình cảm ơn trước, mình cảm thấy bế tắc quá :frowning:

MASM nhưng vẫn có quyền dùng WinAPI chứ? Chẳng lẽ bắt phải xài interrupt chay à.

3 Likes

Mấy bài này cơ bản mà :sweat_smile:. Bạn thử tự làm xem

1 Like
.586
.model flat,stdcall

.data
str1 BYTE "            CALCULATION PROGRAM",0
str2 BYTE "-----------------------------------------",0
str3 BYTE "1- Calculate the sum of n of the first natural numbers",0
str4 BYTE"2- Calculate n!",0
str5 BYTE "3- Calculate the element of n of the Fibonacci sequence",0
str6 BYTE "4- Quit",0
str7 BYTE "Select 1 .. 4:",0

Option_1_msg BYTE "Select n: ",0
Result_option_1 BYTE "Ket qua: ",0
.code
Option_1 proc
	invoke WriteString,offset Option_1_msg,0
	invoke ReadDec,0,0

	mov ecx,eax
	mov eax,0; Ket qua
	mov edx,0; So tang tu 1 den n

	L1:
		inc edx
		add eax,edx
	loop L1

	invoke WriteString,offset Result_option_1,0
	invoke WriteDec,1; In ra ket qua trong eax
ret
Option_1 endp

main proc
	mov ecx,6
	
	; In ra 6 dong thong bao
	invoke WriteString,offset str1,1
	invoke WriteString,offset str2,1
	invoke WriteString,offset str3,1
	invoke WriteString,offset str4,1
	invoke WriteString,offset str5,1
	invoke WriteString,offset str6,1
	invoke WriteString,offset str7,0

	invoke ReadDec,0,0
	
	.If(eax == 1)
		invoke Option_1;
	.EndIf
exit
main endp

end main

Hàm writeString:

WriteString proc Uses eax ebx ecx edx esi edi,pArr:PTR BYTE,EOF:DWORD
	invoke GetStdHandle,STD_OUTPUT_HANDLE
	invoke CountNumOfChars,pArr
	invoke WriteConsoleA,eax,pArr,ecx,offset _dword,0
	cmp EOF,0
	jz quit
	invoke GetStdHandle,STD_OUTPUT_HANDLE
	invoke WriteConsoleA,eax,offset _EOF,2,offset _dword,0
	quit:
ret
WriteString endp

ReadDec proc Uses ebx ecx edx esi edi, pNum:DWORD, NumFlag:DWORD
	Local Num[12]:BYTE, NumOfChars:DWORD,Result:DWORD

	.If(NumFlag == ARR_FLAG_YES)
		mov esi,pNum
		invoke CountNumOfChars,esi
	.Else
		lea esi,Num
		lea edi,NumOfChars
		invoke ReadString,esi,12,edi
		mov ecx,NumOfChars
	.EndIf

	add esi,ecx
	mov Result,0
	mov ebx,1
	L1:
		dec esi
		movzx eax,BYTE PTR[esi]
		sub eax,30h
		mul ebx
		add Result,eax
		mov eax,10 
		mul ebx
		mov ebx,eax
	loop L1
	mov eax,Result
ret
ReadDec endp

WriteDec proc,EOF:DWORD
	Local Num[13]:BYTE
	pushad
	.If(eax == 0)
		lea esi,Num
		mov BYTE PTR[esi + 1],0
		mov BYTE PTR[esi],"0"
		invoke WriteString,esi,EOF
		popad
		ret
	.EndIf
	mov ebx,10
	lea esi,Num
	add esi,11; Write From the end
	mov BYTE PTR[esi],0
	W1:
		cmp eax,0
		jz quitW1
		dec esi
		mov edx,0
		div ebx
		add dl,30h; create char
		mov BYTE PTR[esi],dl
	jmp W1
	quitW1:
	invoke WriteString,esi,EOF
	popad
ret
WriteDec endp

ReadString proc,pArr:PTR BYTE,len:DWORD,pNumOfCharsRead:PTR DWORD
	pushad
	invoke GetStdHandle,STD_INPUT_HANDLE
	invoke ReadFile,eax,pArr,len,pNumOfCharsRead,0
	mov esi,pNumOfCharsRead
	mov edi,pArr
	mov edx,[esi];edx = Num
	sub edx,2
	mov [esi],edx
	mov BYTE PTR[edi+edx],0
	popad
ret
ReadString endp

Bài 1 này. 0: không xuống dòng, 1: xuông dòng

2 Likes

Cậu nên tự hoàn thành lấy bài tập cơ bản của cậu chứ @nhat7hsuper123? :smile:

Nếu như cậu “hơi khó hiểu” vấn đề gì, tớ kỳ vọng cậu nên hỏi thẳng vào vấn đề đó. Nhờ người khác làm hộ bài tập không phải cách học đâu (như @newbie_lap_trinh đề cập, đây là bài tập cơ bản. Cậu ấy còn đã rất tốt bụng đưa code mẫu cho cậu).

Việc cậu nhờ người khác làm hộ bài tập của cậu là gian lận (khi cậu hoàn thành công việc không phải nhờ kiến thức của cậu). Cậu có thể gian lận lúc còn ngồi trên ghế nhà trường (vốn chẳng có ý nghĩa gì, vì cậu cần học lấy kiến thức nền tảng ở đó để phục vụ cho công việc sau này, không phải gian lận lấy điểm cao ở đó), nhưng cậu không thể gian lận khi đi làm được đâu.

4 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?