PDA

View Full Version : سوال: اجرا نشدن برنامه



reza4344
دوشنبه 12 تیر 1391, 11:39 صبح
.386
.model flat,stdcall
option casemap:none

WinMain proto :DWORD,:DWORD,:DWORD,:DWORD

include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\gdi32.inc
include \masm32\include\winmm.inc

includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\gdi32.lib
includelib \masm32\lib\winmm.lib



.data
ClassName db "SimpleWinClass",0
AppName db "SimpleVirtualPiano",0
szText db 'This is a Simple VirtualPiano----------->made bu liuwei 2003.11.19',0h

.data?
hInstance HINSTANCE ?
hdc HDC ?
midiFlag BYTE ?
midiPu DWORD ?
midiYu DWORD ?
midiPlayFlag BYTE ?


.code
start:
invoke GetModuleHandle, NULL
mov hInstance,eax
invoke WinMain, hInstance,NULL,NULL,SW_SHOWDEFAULT
invoke ExitProcess,eax

WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR, CmdShow:DWORD
LOCAL wc:WNDCLASSEX
LOCAL msg:MSG
LOCAL hwnd:HWND
mov wc.cbSize,SIZEOF WNDCLASSEX
mov wc.style, CS_HREDRAW or CS_VREDRAW
mov wc.lpfnWndProc, OFFSET WndProc
mov wc.cbClsExtra,NULL
mov wc.cbWndExtra,NULL
push hInst
pop wc.hInstance
mov wc.hbrBackground,COLOR_WINDOW+1
mov wc.lpszMenuName,NULL
mov wc.lpszClassName,OFFSET ClassName
invoke LoadIcon,NULL,IDI_APPLICATION
mov wc.hIcon,eax
mov wc.hIconSm,eax
invoke LoadCursor,NULL,IDC_ARROW
mov wc.hCursor,eax
invoke RegisterClassEx, addr wc
INVOKE CreateWindowEx,NULL,ADDR ClassName,ADDR AppName,\
WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,\
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NUL L,\
hInst,NULL
mov hwnd,eax
INVOKE ShowWindow, hwnd,SW_SHOWNORMAL
INVOKE UpdateWindow, hwnd
invoke midiOutOpen,ADDR hdc,-1,NULL,NULL,NULL
mov midiYu,0h
mov midiPlayFlag,1h
.WHILE TRUE
INVOKE GetMessage, ADDR msg,NULL,0,0
.BREAK .IF (!eax)
INVOKE TranslateMessage, ADDR msg
INVOKE DispatchMessage, ADDR msg
.ENDW
mov eax,msg.wParam
ret
WinMain endp
WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
local @stPs:PAINTSTRUCT
local @stRect:RECT
local @hDc
local @playf:WORD

.IF uMsg==WM_DESTROY
invoke midiOutClose,hdc
invoke PostQuitMessage,NULL

.ELSEIF uMsg ==WM_PAINT
invoke BeginPaint,hWnd,addr @stPs
mov @hDc,eax
invoke GetClientRect,hWnd,addr @stRect
invoke DrawText,@hDc,addr szText,-1,\
addr @stRect,\
DT_SINGLELINE or DT_CENTER or DT_VCENTER
invoke EndPaint,hWnd,addr @stPs
.ELSEIF uMsg==WM_CHAR
mov @playf,0h
push wParam
pop midiPu
;===============ESC¼üµؤ¹¦ؤـ=============== =
.if midiPu==WM_DEVMODECHANGE ;1bh
invoke midiOutClose,hdc
invoke PostQuitMessage,NULL
.ENDIF
;----------------------------------------


.if midiPu==61h
mov midiYu,-24
.elseif midiPu==62h
mov midiYu,-12
.elseif midiPu==63h
mov midiYu,0
.elseif midiPu==64h
mov midiYu,12
.elseif midiPu==65h
mov midiYu,24

;===============ب«زô========================== ==
.elseif midiPu==31h
mov midiPu,3ch
mov @playf,1
.elseif midiPu==32h
mov midiPu,3eh
mov @playf,1
.elseif midiPu==33h
mov midiPu,40h
mov @playf,1
.elseif midiPu==34h
mov midiPu,41h
mov @playf,1
.elseif midiPu==35h
mov midiPu,43h
mov @playf,1
.elseif midiPu==36h
mov midiPu,45h
mov @playf,1
.elseif midiPu==37h
mov midiPu,47h
mov @playf,1
;================°ëزô========================= ==
.elseif midiPu==71h
mov midiPu,3dh
mov @playf,1
.elseif midiPu==77h
mov midiPu,3fh
mov @playf,1
.elseif midiPu==72h
mov midiPu,42h
mov @playf,1
.elseif midiPu==74h
mov midiPu,44h
mov @playf,1
.elseif midiPu==79h
mov midiPu,46h
mov @playf,1
.endif
;-------------------------------------------
.if @playf==1
mov eax,midiYu
add midiPu,eax
mov cl,8
shl midiPu,cl
and midiPu,0ff00h
add midiPu,680090h
.if midiPlayFlag==1h
;================µ÷سأةù؟¨µؤ´ْآë===== =================

invoke midiOutShortMsg,hdc,midiPu
mov midiPlayFlag,0h
;-------------------ةù؟¨´ْآë½لتّ------------------------
.endif
.endif
.ELSEIF uMsg==WM_KEYUP
mov midiPlayFlag,1h
.ELSE
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
.ENDIF
xor eax,eax
ret
WndProc endp
end start





دوستان این کد رو اجرا می کنم error میده اگه لطف کنید بگین ایراد کار از کجاست ممنون میشم(راستی من با emu تست کردم)

از توابع کتابخانه ای ایراد می گیره

xman_1365_x
دوشنبه 12 تیر 1391, 19:28 عصر
این برنامه ویندوزی شبیه سازی پیانو هست و با masm32 میتونید اسمبلش کنید ، برنامه emu8086 فقط قابلیت اسمبل کردن دستورات 8086 رو دارد. البته اسمبلر داخل برنامه که fasm میباشد توانایی اسمبل برنامه های 32 بیتی را دارد که باید با command prompt انجام بدین.
اگر برنامه پیانو رو برای 8086 بخواین باید با پورت 42و43 کار کنید نمونه برنامه در گوگل هست همینطور کتاب زبان ماشین و اسمبلی سید رضی

موفق باشید.

reza4344
دوشنبه 12 تیر 1391, 20:01 عصر
ممنون دوست عزیز .........من از ویندوز 7 استفاده می کنم و نمی تونم به tasm and masm دسترسی داشته باشم برای اسمبل کردنش راه دیگه ای نیست (در ضمن من اسمبلر masm32 رو نصب کردم ولی نحوه کار با اونو بلد نیستم) میشه راهنماییم کنید تا با masm32 این برنامه رو لود کنم

2- هیچ convert برای تبدیل کد masm32 به emu8086 نیست؟

ممنون میشم

xman_1365_x
دوشنبه 12 تیر 1391, 23:35 عصر
من از ویندوز 7 استفاده می کنم و نمی تونم به tasm and masm دسترسی داشته باشم برای اسمبل کردنش راه دیگه ای نیست
masm نسخه های متفاوتی داره ورژن جدید که در همون masm32 هست قابلیت اسمبل کردن برنامه رو داره در پوشه bin میتونید بهش دسترسی داشته باشید

(در ضمن من اسمبلر masm32 رو نصب کردم ولی نحوه کار با اونو بلد نیستم) میشه راهنماییم کنید تا با masm32 این برنامه رو لود کنم
درکل اول راهنمای خودش رو بخونید بعدشم سری به تالارش بزنید جواب همه سوال هاتون هست
با masm32 دو حالت برای اسمبل و لینک وجود داره 1-مسیر خط فرمان که اول coff میسازید بعد با لینکر لینکش میکنید 2-مسیر گرافیکی:
از مسیر masm32 برنامه qeditor رو اجرا کنید کدتون رو باهاش باز کنید بعد از منوی project گزینه build all رو انتخاب کنید،کد شما بسادگی باهاش اسمبل و لینک میشه البته خط 61 پارامتر 10 رو خطا میگیره که به صورت NUL L هست که به صورت NULL اصلاحش کنید.


2- هیچ convert برای تبدیل کد masm32 به emu8086 نیست؟
من ندیدم،شدنی هست اما کار منطقی هم نیست فکر نکنم باشه،در کل دوست عزیز بدونید چی خوندین بعد جستجو کنید برای کدش،خیلی این دو متفاوت هستن ویندوز چون دسترسی مستقیم به پورت رو جلوش رو در مد کاربر میگیره این برنامه از این تابع استفاده کرده یک مشکلی که من دیدم هم اینه وقتی دو یا چند کلید با هم فشار داده میشه باید نت تغییر کنه اما چون شرط ها فقط برای یک کلید هست یک نوت بیشتر تولید نمیشه،توی داس هم مقدار فرکانس رو به پورت میفرستادیم همین
در باره تابع midiOutShortMsg که در این برنامه استفاده شده هم میتونید از این لینک ها اطلاعات بیشتری بدست بیارین
http://msdn.microsoft.com/en-us/library/windows/desktop/dd798481(v=vs.85).aspx
http://msdn.microsoft.com/en-us/subscriptions/ms711640(v=vs.85).aspx
http://msdn.microsoft.com/en-us/subscriptions/ms712058(v=vs.85).aspx

موفق باشی