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á
Giúp bài tập lập trình assembly qua masm32
MASM nhưng vẫn có quyền dùng WinAPI chứ? Chẳng lẽ bắt phải xài interrupt chay à.
Mấy bài này cơ bản mà . Bạn thử tự làm xem
.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
Cậu nên tự hoàn thành lấy bài tập cơ bản của cậu chứ @nhat7hsuper123?
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.