PDA

View Full Version : نشان دادن ساعت سیستم



majid1605
یک شنبه 29 آبان 1390, 21:22 عصر
من می خوام برنامه ایی بنویسم که ساعت سیستم رو نمایش بده البته توی MASM32 یعنی یه پنجره کوچولو رو با استفاده از API های ویندوز ایجاد و ساعت رو نشون یده می خواستم بدونم امکان چنین کاری وجود داره ؟
و اینکه چطور میشه اینکار رو کرد یعنی اگه تابعی داره ممنون میشم بگید چیه و چطور فراخوانیش کنم

#target
یک شنبه 29 آبان 1390, 22:14 عصر
تابع GetLocalTime یا GetSystemTime
قبلش هم کافیه SYSTEMTIME آدرسشو Push کنی

http://msdn.microsoft.com/en-us/library/windows/desktop/ms724950(v=VS.85).aspx
http://msdn.microsoft.com/en-us/library/windows/desktop/ms724390(v=VS.85).aspx
http://msdn.microsoft.com/en-us/library/windows/desktop/ms724338(v=VS.85).aspx

majid1605
سه شنبه 01 آذر 1390, 02:43 صبح
راستش من تازه برنامه نویسی اسمبلی رو شروع کردم و تازه ساخت پنجره ویندوز و یا نشون دادن اونو یاد گرفتم حالا می خوام ساعت رو هم داخلش نشون بدم .میشه یه نمونه از به کار گیری اون تابع رو برام بزارید.و چطور ادرسش رو push کنم ممنن میشم

xman_1365_x
سه شنبه 01 آذر 1390, 19:01 عصر
راستش من تازه برنامه نویسی اسمبلی رو شروع کردم و تازه ساخت پنجره ویندوز و یا نشون دادن اونو یاد گرفتم حالا می خوام ساعت رو هم داخلش نشون بدم .میشه یه نمونه از به کار گیری اون تابع رو برام بزارید.و چطور ادرسش رو push کنم ممنن میشم
اول باید یک ساختمان داده مثل لینک هایی که در پست2 قرار دادن تعریف کنید
بعد اگر stime ساختمان ما باشه به شکل زیر فراخوانی میشه


lea eax,dword ptr stime
push eax
call dword ptr GetLocalTime
و بعد هم دستیابی می کنید به اعضا ساختمان و نمایش میدین
برای مثال


xor eax,eax
mov al,byte ptr stime.wMinute
xor eax,eax
mov al,byte ptr stime.wHour
با این دستورات به ساعت و دقیقه دسترسی پیدا میکنید.
و نظر من اینه که اگر تازه شروع کردید وقتی خودتون رو درگیر api ها کردین فکر نمیکنم چیزی از اسمبلی یاد بگیرین ، 99% هم زده میشین چون هم درگیر ساختار های توابع پیچیده ویندوز میشین و هم اسمبلی
موفق باشی

majid1605
سه شنبه 01 آذر 1390, 21:28 عصر
من فقط می خوام اسمبلی رو تا حدی یاد بگیرم که بتونم یه پرژه تحویل بدم و می خوام تا حد زیادی خودم روش کارکنم تا اینکه بدم یه نفر .
در مورد API های ویندوز باهشون آشنایی نسبی دارم البته توی ++C ، چیزی که توی اسمبلی هم دیدم تقریباً مثل هم هستند.
ولی اسمبلی رو خیلی ضعیف هستم:گریه:
ممنون

xman_1365_x
سه شنبه 01 آذر 1390, 22:53 عصر
من فقط می خوام اسمبلی رو تا حدی یاد بگیرم که بتونم یه پرژه تحویل بدم و می خوام تا حد زیادی خودم روش کارکنم تا اینکه بدم یه نفر .
در مورد API های ویندوز باهشون آشنایی نسبی دارم البته توی ++C ، چیزی که توی اسمبلی هم دیدم تقریباً مثل هم هستند.
ولی اسمبلی رو خیلی ضعیف هستم:گریه:
ممنون
خوب برای یادگیری اسمبلی کتاب های زیادی هست که باید مطالعه کنید(یک جستجو توی گوگل) در نهایت بیاین سراغ api ها البته هنگامی که تحت کنسول توی ویندوز کار کنید بیشتر از api های kernel32 استفاده میکنید که گرفتن زمان هم جزء توابع همین کتابخانه هست.
لینک زیر هم بعدا بدرتون میخوره راهنمای api داره که خیلی خوبه و همینطور مثال های زیادی
http://win32assembly.online.fr/tutorials.html
موفق باشی

xman_1365_x
چهارشنبه 02 آذر 1390, 19:23 عصر
تحت کنسول رو براتون نوشتم ،چون میدونم بدرد دوستان دیگه هم میخوره

نکات آموزشی که داره:
استفاده از ساختمان
استفاده از توابع ویندوز (api)
استفاده از ماکرو و فایل های کتابخانه ای در masm


;Build manual:
;ml /c /coff /Cp /Zi time1.asm
;Link /SUBSYSTEM:CONSOLE /DEBUG /LIBPATH:c:\masm32\lib time1.obj



; ««««««««««««««««««««««««« ««««««««««««««««««««««««« «««««««««««««««««««««««

; Build this with the "Project" menu using
; "Console Assemble and Link"

; ««««««««««««««««««««««««« ««««««««««««««««««««««««« «««««««««««««««««««««««

.486 ; create 32 bit code
.model flat, stdcall ; 32 bit memory model
option casemap :none ; case sensitive


include \masm32\include\windows.inc ; always first
include \masm32\macros\macros.asm ; MASM support macros

; -----------------------------------------------------------------
; include files that have MASM format prototypes for function calls
; -----------------------------------------------------------------
include \masm32\include\masm32.inc
include \masm32\include\gdi32.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\msvcrt.inc ;crt__ultoa
; ------------------------------------------------
; Library files that have definitions for function
; exports and tested reliable prebuilt code.
; ------------------------------------------------
includelib \masm32\lib\masm32.lib
includelib \masm32\lib\gdi32.lib
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib

includelib \masm32\lib\msvcrt.lib ;crt__ultoa


.const
;nothing
.data
;nothing
.data?


stimestruct STRUCT
wYear WORD ?
wMonth WORD ?
wDayOfWeek WORD ?
wDay WORD ?
wHour WORD ?
wMinute WORD ?
wSecond WORD ?
wMilliseconds WORD ?
stimestruct EndS

stime stimestruct {}


.code

; ««««««««««««««««««««««««« ««««««««««««««««««««««««« «««««««««««««««««««««««

start:



print chr$(13,10)



lea ebx,stime
push ebx
call GetLocalTime


print chr$("LocalTime is: ")


xor eax,eax
mov al,byte ptr [ebx].stimestruct.wHour
print ustr$ (eax)

print chr$(":")

xor eax,eax
mov al,byte ptr [ebx].stimestruct.wMinute
print ustr$ (eax)



print chr$(13,10)


lea ebx,stime
push ebx
call GetSystemTime

print chr$("SystemTime is: ")
xor eax,eax
mov al,byte ptr [ebx].stimestruct.wHour
print ustr$ (eax)

print chr$(":")

xor eax,eax
mov al,byte ptr [ebx].stimestruct.wMinute
print ustr$ (eax)


print chr$(13,10)
exit

; ««««««««««««««««««««««««« ««««««««««««««««««««««««« «««««««««««««««««««««««

end start



موفق باشید

majid1605
چهارشنبه 02 آذر 1390, 20:30 عصر
ممنون
متاسفانه بعد از کامپایل فایل EXE برام اجرا نمیشه بدون هیچ خطایی یعنی وقتی روش کلیک می کنم هیچ اتفاقی نمیفته به خاطر 64 بیتی بودن ویندوزمه؟

می تونید یه برنامه به صورت گرافیکی بنویسید و یه توضیح در مورد دستورات مهمش بدید منظورم از گرافیکی یعنی از پنجره ویندوز استفاده کنه مثلاً یکی که تاریخ سیستم رو نشون بده حالا فقط سال هم باشه کافیه ولی در موردش توضیح بدید ممنون میشم .
البته شما که این برنامه رو گذاشتید که بدرد دوستان دیگه بخوره یه توضیح جامع هم میدادید تا کارتون کاملتر بشه

xman_1365_x
چهارشنبه 02 آذر 1390, 21:16 عصر
ممنون
متاسفانه بعد از کامپایل فایل EXE برام اجرا نمیشه بدون هیچ خطایی یعنی وقتی روش کلیک می کنم هیچ اتفاقی نمیفته به خاطر 64 بیتی بودن ویندوزمه؟

می تونید یه برنامه به صورت گرافیکی بنویسید و یه توضیح در مورد دستورات مهمش بدید منظورم از گرافیکی یعنی از پنجره ویندوز استفاده کنه مثلاً یکی که تاریخ سیستم رو نشون بده حالا فقط سال هم باشه کافیه ولی در موردش توضیح بدید ممنون میشم .
البته شما که این برنامه رو گذاشتید که بدرد دوستان دیگه بخوره یه توضیح جامع هم میدادید تا کارتون کاملتر بشه

مشکل اینه تحت کنسول اجراش نکردین فقط دابل کلیک کردین ، سیستم عامل من هم 64 بیتی هست ، وقتی دابل کلیک میکنید سریع اجرا میشه و بسته میشه
برای اینکه با دابل کلیک هم قابل مشاهده باشه
این خط رو حذف کنید از آخر

print chr$(13,10)
و بجاش این خط رو جایگزین کنید

mov eax, input(13,10,"Press enter to exit...")
موفق باشی

majid1605
چهارشنبه 02 آذر 1390, 21:22 عصر
این بار هم اجرا نمیشه پنجره پیغام ویندوز 7 میاد همون که میره واسه چک کردن

xman_1365_x
چهارشنبه 02 آذر 1390, 21:31 عصر
این بار هم اجرا نمیشه پنجره پیغام ویندوز 7 میاد همون که میره واسه چک کردن
فایل اجرایی به همرا سورس و... رو آپلود کردم ، ببینید فایل اجرایی خطا میده یا نه؟
78302

majid1605
چهارشنبه 02 آذر 1390, 21:40 عصر
نه درست کار می کنه چرا توی سیستم من خطا میده؟
اون ساعت سیستم چیه ؟

xman_1365_x
چهارشنبه 02 آذر 1390, 23:01 عصر
می تونید یه برنامه به صورت گرافیکی بنویسید و یه توضیح در مورد دستورات مهمش بدید منظورم از گرافیکی یعنی از پنجره ویندوز استفاده کنه مثلاً یکی که تاریخ سیستم رو نشون بده حالا فقط سال هم باشه کافیه ولی در موردش توضیح بدید ممنون میشم .
البته شما که این برنامه رو گذاشتید که بدرد دوستان دیگه بخوره یه توضیح جامع هم میدادید تا کارتون کاملتر بشه
در این باره یادم رفت بگم اینجا یا دوستای ما همه حرفه ای هستن یا علاقه مند نیستن من به بازخورد ها نگاه میکنم اگر استقبال شه مطلبی رو آموزش میدم و یا بعد بیشتر از این توضیح میدم،در مورد برنامه ویندوزی چون پروژه شما بوده ننوشتم اما هیچ فرقی نداره کمی پیچیده تر میشه چون توابع بیشتری فراخوانی میشن


نه درست کار می کنه چرا توی سیستم من خطا میده؟
در دو خط اول نوشتم چطور اسمبلش کنید با همون دستورات این کارو انجام بدین نباید مشکلی پیش بیاد

اون ساعت سیستم چیه ؟
Coordinated Universal Time (UTC)زمان هماهنگ جهانی (UTC) یک استاندارد بسیار دقیق زمان اتمی برای تعیین ساعت‌ها و اختلافات زمانی در سراسر جهان است.

«زمان هماهنگ جهانی» بیشتر از ۰٫۹ ثانیه با ساعت گرینویچ اختلاف ندارد و برای بسیاری از کاربردهای روزمره چنین اختلافی قابل صرف‌نظر کردن است.

local time زمان جاری سیستم رو نمایش میده

majid1605
پنج شنبه 03 آذر 1390, 00:11 صبح
در مورد آموزش ها که یا ناقص هستند یا خیلی قدیمی 16 بیتی کتابی هم که پیدا کردم همینطوره .مطمئناً در مورد مطالب آموزشی خیلی ها هم هستند که دنبال مطالب اموزشی جدید هستند .
معمولاً خودم اگه چیزی بلد باشم یه جوری مطلب رو میزارم که بقیه هم متوجه بشن نمونش هم توی سات خودم موجوده و به این هم کاری ندارم که قبلاً ارائه شده و یا اینکه کاربری ممکنه نیاد بخوندش.
به هر حال شما مختارید و ممکنه وقتش رو هم نداشته باشید.

در مورد پروژه من گفتم که اگه همون تاریخ رو هم نشون بده ولی به صورت گرافیکی بزارید خیلی خوب میشد و در موردش یه توضیحی بدید
و اگه تونستم ساعت رو به صورت گرافیکی بنویم میزارمش همین جا واسه بقیه .

xman_1365_x
جمعه 04 آذر 1390, 00:37 صبح
در مورد آموزش ها که یا ناقص هستند یا خیلی قدیمی 16 بیتی کتابی هم که پیدا کردم همینطوره .مطمئناً در مورد مطالب آموزشی خیلی ها هم هستند که دنبال مطالب اموزشی جدید هستند .
معمولاً خودم اگه چیزی بلد باشم یه جوری مطلب رو میزارم که بقیه هم متوجه بشن نمونش هم توی سات خودم موجوده و به این هم کاری ندارم که قبلاً ارائه شده و یا اینکه کاربری ممکنه نیاد بخوندش.
به هر حال شما مختارید و ممکنه وقتش رو هم نداشته باشید.

در مورد پروژه من گفتم که اگه همون تاریخ رو هم نشون بده ولی به صورت گرافیکی بزارید خیلی خوب میشد و در موردش یه توضیحی بدید
و اگه تونستم ساعت رو به صورت گرافیکی بنویم میزارمش همین جا واسه بقیه .
در مورد کتاب شما باید یک زمینه داشته باشین کتاب های 8086 به معنی این نیست که دیگه بدرد نمیخورن اونا کتاب پایه هست که باید یاد گرفت، کتاب فارسی برنامه نویسی 32 بیتی زبان اسمبلی و معماری زیر پردازنده 80x86 مشحون که در محیط کنسول رو آموزش میده و روی اسمبلی تاکید داره نه ماکرو های اسمبلر اما اگر بیس 16 رو ندونید به مشکل میخوری و کتاب دیگه آشنايي با برنامه نويسي اسمبلي ويندوز وحيد نصيري ،کتاب انگلیسی هم که زیاد هست میتونید جستجو کنید!
و در ارتباط با ادامه حرفاتون ببینید دوست عزیز شما فرمودین در زمینه اسمبلی چیزی نمیدونید حالا من بیام توضیح چی بدم ؟ شما باید یک سری مقدماتو بدونید، بعد اگر جایی از کد براتون نا مفهوم بپرسید بعد جواب میدم
الان من صرفا به هدف تاپیک پاسخ دادم ( اموزش مربوط به توابع برای ایجاد برنامه gui و هم فراخوانی تابع زمان) پس هرچیزی به غیر این یعنی آف تاپیک و باعث قفل شدن تاپیک میشه
اگر سوالی در رابطه با کد هست بفرمایید اگر نه که هیچ
موفق باشی

majid1605
چهارشنبه 16 آذر 1390, 14:16 عصر
.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
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
.data
ClassName db "SimpleWinClass",0
AppName db "Our First Window",0
OurText db "Win32 assembly is great and easy!",0
.data?
hInstance HINSTANCE ?
CommandLine LPSTR ?

stimestruct STRUCT
wYear WORD ?
wMonth WORD ?
wDayOfWeek WORD ?
wDay WORD ?
wHour WORD ?
wMinute WORD ?
wSecond WORD ?
wMilliseconds WORD ?
stimestruct EndS

stime stimestruct {}

.code
start:
invoke GetModuleHandle, NULL
mov hInstance,eax
invoke GetCommandLine
mov CommandLine,eax
invoke WinMain, hInstance,NULL,CommandLine, 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,0
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
.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 hdc:HDC
LOCAL ps:PAINTSTRUCT
LOCAL rect:RECT
.IF uMsg==WM_DESTROY
invoke PostQuitMessage,NULL
.ELSEIF uMsg==WM_PAINT
invoke BeginPaint,hWnd, ADDR ps
mov hdc,eax
invoke GetClientRect,hWnd, ADDR rect
invoke DrawText, hdc,ADDR OurText,-1, ADDR rect, DT_SINGLELINE or DT_CENTER or DT_VCENTER
invoke EndPaint,hWnd, ADDR ps
.ELSE
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
.ENDIF
xor eax,eax
ret
WndProc endp
end start



این برنامه ساخت پنجره هست چندتا سوال دارم ممنون میشم جواب بدید

1-mov wc.cbSize,SIZEOF WNDCLASSEX مربوط به اندازه پنجره هستش میشه مثل برنامه هایی که توی ++c می نویسیم عدد هم بهش داد یه مثال هم میزنید.
2-ساختاری رو که گفتید رو توی این برنامه گذاشتم (کپی) میشه بگید کجای برنامه باید فراخوانی تابع زمان رو انجام بدم
3-واسه نمایش یه متن از خط زیر استفاده شده
invoke DrawText, hdc,ADDR OurText,-1, ADDR rect, DT_SINGLELINE or DT_CENTER or DT_VCENTER
و از ADDR OurText که در قسمت datd تعریف کردیم متن رو به پنجره اضافه می کنیم .حالا توی برنامه شده eax زمان رو ذخیره کرده درسته اگه به جای ADDR OurText بزارم کار درستیه؟

xman_1365_x
پنج شنبه 17 آذر 1390, 06:29 صبح
1-mov wc.cbSize,SIZEOF WNDCLASSEX مربوط به اندازه پنجره هستش میشه مثل برنامه هایی که توی ++c می نویسیم عدد هم بهش داد یه مثال هم میزنید.
بله میشه

2-ساختاری رو که گفتید رو توی این برنامه گذاشتم (کپی) میشه بگید کجای برنامه باید فراخوانی تابع زمان رو انجام بدم
کد زیر چیزی که شما نیاز داری هست


.486
.model flat,stdcall
option casemap:none

lpStr macro Text :req
local lText
.data
lText db Text
.code
exitm <addr lText>
endm

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


include c:\masm32\include\windows.inc
include c:\masm32\macros\macros.asm
include c:\masm32\include\user32.inc
include c:\masm32\include\kernel32.inc
includelib c:\masm32\lib\user32.lib
includelib c:\masm32\lib\kernel32.lib
include c:\masm32\include\msvcrt.inc ;crt__ultoa
includelib c:\masm32\lib\msvcrt.lib ;crt__ultoa




.data
ClassName db "SimpleWinClass",0
AppName db "Our First Window",0
OurText db "Win32 assembly is great and easy!",0


MyString DB 20 dup(' '),0

LTimeis db "LocalTime is: "
HTime DB 2 dup (' ')
SymTime db ':'
STime DB 2 dup (' ')
db 0

.data?
hInstance HINSTANCE ?
CommandLine LPSTR ?

stimestruct STRUCT
wYear WORD ?
wMonth WORD ?
wDayOfWeek WORD ?
wDay WORD ?
wHour WORD ?
wMinute WORD ?
wSecond WORD ?
wMilliseconds WORD ?
stimestruct EndS

stime stimestruct {}




.code
start:
invoke GetModuleHandle, NULL
mov hInstance,eax
invoke GetCommandLine
mov CommandLine,eax
invoke WinMain, hInstance,NULL,CommandLine, 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,0
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
.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 hdc:HDC
LOCAL ps:PAINTSTRUCT
LOCAL rect:RECT
.IF uMsg==WM_DESTROY
invoke PostQuitMessage,NULL
.ELSEIF uMsg==WM_PAINT
invoke BeginPaint,hWnd, ADDR ps
mov hdc,eax
invoke GetClientRect,hWnd, ADDR rect
call LTimep
invoke DrawText, hdc,ADDR LTimeis,-1, ADDR rect, DT_SINGLELINE or DT_CENTER or DT_VCENTER
invoke EndPaint,hWnd, ADDR ps
.ELSE
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
.ENDIF
xor eax,eax
ret
WndProc endp

LTimep proc
lea ebx,stime
push ebx
call GetLocalTime

xor eax,eax
mov al,byte ptr [ebx].stimestruct.wHour
invoke crt__ultoa,eax,ADDR MyString,10

mov ax,word ptr MyString
mov word ptr HTime,ax
cmp HTime+1,0
jne next
mov al,HTime
xchg HTime+1,al
mov HTime,' '
next:

xor eax,eax
mov al,byte ptr [ebx].stimestruct.wMinute
invoke crt__ultoa,eax,ADDR MyString,10


mov ax,word ptr MyString
mov word ptr STime,ax
cmp STime+1,0
jne next2
mov STime,al
next2:


ret
LTimep endp
end start



3-واسه نمایش یه متن از خط زیر استفاده شده
invoke DrawText, hdc,ADDR OurText,-1, ADDR rect, DT_SINGLELINE or DT_CENTER or DT_VCENTER
و از ADDR OurText که در قسمت datd تعریف کردیم متن رو به پنجره اضافه می کنیم .حالا توی برنامه شده eax زمان رو ذخیره کرده درسته اگه به جای ADDR OurText بزارم کار درستیه؟
بله شما میخواین روی فرم نمایش بدین که در کد بالا براتون نوشتم

موفق باشی

majid1605
پنج شنبه 17 آذر 1390, 13:40 عصر
.486
.model flat,stdcall
option casemap:none

lpStr macro Text :req
local lText
.data
lText db Text
.code
exitm <addr lText>
endm

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

include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\msvcrt.inc ;crt__ultoa
include \masm32\macros\macros.asm


includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\msvcrt.lib ;crt__ultoa




.data
ClassName db "SimpleWinClass",0
AppName db "Our First Window",0



MyString DB 20 dup(' '),0

LTimeis db "LocalTime is: "
HTime DB 2 dup (' ')
SymTime db ':'
STime DB 2 dup (' ')
db 0

.data?
hInstance HINSTANCE ?
CommandLine LPSTR ?

stimestruct STRUCT
wYear WORD ?
wMonth WORD ?
wDayOfWeek WORD ?
wDay WORD ?
wHour WORD ?
wMinute WORD ?
wSecond WORD ?
wMilliseconds WORD ?
stimestruct EndS

stime stimestruct {}




.code
start:
invoke GetModuleHandle, NULL
mov hInstance,eax
invoke GetCommandLine
mov CommandLine,eax
invoke WinMain, hInstance,NULL,CommandLine, 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,0
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
.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 hdc:HDC
LOCAL ps:PAINTSTRUCT
LOCAL rect:RECT
.IF uMsg==WM_DESTROY
invoke PostQuitMessage,NULL
.ELSEIF uMsg==WM_PAINT
invoke BeginPaint,hWnd, ADDR ps
mov hdc,eax
invoke GetClientRect,hWnd, ADDR rect
call LTimep
invoke DrawText, hdc,ADDR LTimeis,-1, ADDR rect, DT_SINGLELINE or DT_CENTER or DT_VCENTER
invoke EndPaint,hWnd, ADDR ps
.ELSE
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
.ENDIF
xor eax,eax
ret
WndProc endp

LTimep proc
lea ebx,stime
push ebx
call GetLocalTime

xor eax,eax
mov al,byte ptr [ebx].stimestruct.wHour
invoke crt__ultoa,eax,ADDR MyString,10

mov ax,word ptr MyString
mov word ptr HTime,ax
cmp HTime+1,0
jne next
mov al,HTime
xchg HTime+1,al
mov HTime,' '
next:

xor eax,eax
mov al,byte ptr [ebx].stimestruct.wMinute
invoke crt__ultoa,eax,ADDR MyString,10


mov ax,word ptr MyString
mov word ptr STime,ax
cmp STime+1,0
jne next2
mov STime,al
next2:


ret
LTimep endp
end start


این برنامه اجرا نمیشه توی خط 91 از آرگومانها ایراد می گیره

xman_1365_x
جمعه 18 آذر 1390, 00:19 صبح
این برنامه اجرا نمیشه توی خط 91 از آرگومانها ایراد می گیره
دوست عزیز ایکاش با دقت نگاه میکردین وقتی میگه آرگومان 10 در خط 91 مشکل داره با یک نگاه ساده میدیدین null به شکل nul l در اومده این مورد توی کد اول شما بود منم عمدا درست نکردم تا خودتون متوجه بشین،که حتی نگاهشم نکردین:لبخندساده:
ضمنا قسمتهایی در کد اضافه هست ،برای اینکه اول خواستم با روش دیگه بنویسمش ،ماکرو اول برنامه و macros.asm اینکلود شده و OurText در دیتا سگمنت دیگه نیازی نیست ، پاکش کنید.
موفق باشی

majid1605
جمعه 18 آذر 1390, 00:53 صبح
ببخشید ما از همون اول گفتیم تازه کاریم .البته حق با شماست یکم باید به پیغام بیشتر توجه می کردم .

چندتا سوال


lpStr macro Text :req
local lText
.data
lText db Text
.code
exitm <addr lText>
endm



این ماکرو رو واسه چی تعریف کردید؟
میشه در مورد قسمت شرطیش هم یه توضیح بدید چون متوجه کارش نمیشم.

در مورد اندازه پنجره چطوری از عدد واسش استفاده کنم ؟

ممنون

xman_1365_x
جمعه 18 آذر 1390, 02:39 صبح
این ماکرو رو واسه چی تعریف کردید؟
گفتم که چه قسمتهایی رو پاک کنید!
و ماکرو کارش اینه مثلا میخواین به مسیج باکس بنویسید برای اینکه هی نرین توی دیتا سگنت آدرس بزارین یه رشته همونجا مینویسین این ماکرو خودش در دیتا سگمنت قرار میده ، اما همونطور که در پست قبل گفتم نیازی نیست پاکش کنید

میشه در مورد قسمت شرطیش هم یه توضیح بدید چون متوجه کارش نمیشم.
قسمت شرطیش برای نوع قرار گرفتن اعداد به کار میره همین! مثلا اگر تک رقمی هست برای ساعت سمت راست کنار دو نقطه نمایش میدش نه با فاصله و برای دقیقه هم به همین شکله به دونقطه نزدیکش میکنم

در مورد اندازه پنجره چطوری از عدد واسش استفاده کنم ؟
سایز آف خروجیش عدد هست شما عدد ثابت بزارین مثلا 4
سعی کنید برنامه رو در windbg یا ollydbg دیباگ کنید تا بهتر متوجه بشین
موفق باشی

majid1605
جمعه 18 آذر 1390, 20:34 عصر
.486
.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\msvcrt.inc ;crt__ultoa
include \masm32\macros\macros.asm


includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\msvcrt.lib ;crt__ultoa




.data
ClassName db "SimpleWinClass",0
AppName db "Our First Window",0
OurText db "Win32 assembly is great and easy!",0


MyString DB 20 dup(' '),0

LTimeis db "LocalTime is: "
HTime DB 2 dup (' ')
SymTime db ':'
STime DB 2 dup (' ')
db 0
wwd WORD ?
wht WORD ?

.data?
hInstance HINSTANCE ?
CommandLine LPSTR ?

stimestruct STRUCT
wYear WORD ?
wMonth WORD ?
wDayOfWeek WORD ?
wDay WORD ?
wHour WORD ?
wMinute WORD ?
wSecond WORD ?
wMilliseconds WORD ?
stimestruct EndS

stime stimestruct {}




.code
start:
invoke GetModuleHandle, NULL
mov hInstance,eax
invoke GetCommandLine
mov CommandLine,eax
invoke WinMain, hInstance,NULL,CommandLine, 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,0
invoke LoadCursor,NULL,IDC_ARROW
mov wc.hCursor,eax
mov wwd,10
mov wht,5
invoke RegisterClassEx, addr wc
INVOKE CreateWindowEx,NULL,ADDR ClassName,ADDR AppName,\
WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,\
CW_USEDEFAULT,wwd,wht,NULL,NULL,\
hInst,NULL
mov hwnd,eax
INVOKE ShowWindow, hwnd,SW_SHOWNORMAL
INVOKE UpdateWindow, hwnd
.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 hdc:HDC
LOCAL ps:PAINTSTRUCT
LOCAL rect:RECT
.IF uMsg==WM_DESTROY
invoke PostQuitMessage,NULL
.ELSEIF uMsg==WM_PAINT
invoke BeginPaint,hWnd, ADDR ps
mov hdc,eax
invoke GetClientRect,hWnd, ADDR rect
call LTimep
invoke DrawText, hdc,ADDR LTimeis,-1, ADDR rect, DT_SINGLELINE or DT_CENTER or DT_VCENTER
invoke EndPaint,hWnd, ADDR ps
.ELSE
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
.ENDIF
xor eax,eax
ret
WndProc endp

LTimep proc
lea ebx,stime
push ebx
call GetLocalTime

xor eax,eax
mov al,byte ptr [ebx].stimestruct.wHour
invoke crt__ultoa,eax,ADDR MyString,10

mov ax,word ptr MyString
mov word ptr HTime,ax
cmp HTime+1,0
jne next
mov al,HTime
xchg HTime+1,al
mov HTime,' '
next:

xor eax,eax
mov al,byte ptr [ebx].stimestruct.wMinute
invoke crt__ultoa,eax,ADDR MyString,10


mov ax,word ptr MyString
mov word ptr STime,ax
cmp STime+1,0
jne next2
mov STime,al
next2:


ret
LTimep endp
end start

majid1605
جمعه 18 آذر 1390, 20:40 عصر
توی خط 35 و 36 دوتا متغیر تعریف کردم البته میدونم جاشون اشتباه است:لبخند:

توی خط 85 و 86 بهشون مقدار دادم و توی خط 90 ازشون استفاده کردم ولی اندازه ارتفاع هر اندزه ایی میدم یکسانه و به اندازه کل صفحه میشه چرا؟

توی خط 89 و 90 این دوتا CW_USEDEFAULT ارگومان واسه تعیین position است ؟اگه آره چطور باید مقدار دهی بشن از روش بالا استفاده کردم نشد

majid1605
دوشنبه 21 آذر 1390, 19:57 عصر
ممنون میشم بگید کجای کار رو اشتباه کردم.



.486
.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\msvcrt.inc ;crt__ultoa
include \masm32\macros\macros.asm


includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\msvcrt.lib ;crt__ultoa




.data
ClassName db "SimpleWinClass",0
AppName db "Local Time",0


MyString DB 20 dup(' '),0

LTimeis db "LocalTime is: "
HTime DB 2 dup (' ')
SymTime db ':'
STime DB 2 dup (' ')
db 0


.data?

hInstance HINSTANCE ?
CommandLine LPSTR ?


width_w WORD ?
height_w WORD ?

stimestruct STRUCT
wYear WORD ?
wMonth WORD ?
wDayOfWeek WORD ?
wDay WORD ?
wHour WORD ?
wMinute WORD ?
wSecond WORD ?
wMilliseconds WORD ?
stimestruct EndS

stime stimestruct {}




.code
start:
invoke GetModuleHandle, NULL
mov hInstance,eax
invoke GetCommandLine
mov CommandLine,eax
invoke WinMain, hInstance,NULL,CommandLine, 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,0
invoke LoadCursor,NULL,IDC_ARROW
mov wc.hCursor,eax
mov width_w,200
mov height_w,200
invoke RegisterClassEx, addr wc
INVOKE CreateWindowEx,NULL,ADDR ClassName,ADDR AppName,\
WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,\
CW_USEDEFAULT,width_w,height_w,NULL,NULL,\
hInst,NULL
mov hwnd,eax
INVOKE ShowWindow, hwnd,SW_SHOWNORMAL
INVOKE UpdateWindow, hwnd
.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 hdc:HDC
LOCAL ps:PAINTSTRUCT
LOCAL rect:RECT
.IF uMsg==WM_DESTROY
invoke PostQuitMessage,NULL
.ELSEIF uMsg==WM_PAINT
invoke BeginPaint,hWnd, ADDR ps
mov hdc,eax
invoke GetClientRect,hWnd, ADDR rect
call LTimep
invoke DrawText, hdc,ADDR LTimeis,-1, ADDR rect, DT_SINGLELINE or DT_CENTER or DT_VCENTER
invoke EndPaint,hWnd, ADDR ps
.ELSE
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
.ENDIF
xor eax,eax
ret
WndProc endp

LTimep proc
lea ebx,stime
push ebx
call GetLocalTime

xor eax,eax
mov al,byte ptr [ebx].stimestruct.wHour
invoke crt__ultoa,eax,ADDR MyString,10

mov ax,word ptr MyString
mov word ptr HTime,ax
cmp HTime+1,0
jne next
mov al,HTime
xchg HTime+1,al
mov HTime,' '
next:

xor eax,eax
mov al,byte ptr [ebx].stimestruct.wMinute
invoke crt__ultoa,eax,ADDR MyString,10


mov ax,word ptr MyString
mov word ptr STime,ax
cmp STime+1,0
jne next2
mov STime,al
next2:


ret
LTimep endp
end start

xman_1365_x
سه شنبه 22 آذر 1390, 12:31 عصر
برای رفع مشکلتون با تابع CreateWindowEx به این (http://msdn.microsoft.com/en-us/library/windows/desktop/ms632680(v=vs.85).aspx)لینک سر بزنید و پارامتر ها رو بررسی کنید مشکلتون حل میشه

ویرایش: تاپیک مجددا باز شد،قوانین سایت را رعایت کنید.

موفق باشید

majid1605
سه شنبه 22 آذر 1390, 16:23 عصر
LTimep proc
lea ebx,stime
push ebx
call GetLocalTime

xor eax,eax
mov al,byte ptr [ebx].stimestruct.wHour
invoke crt__ultoa,eax,ADDR MyString,10

mov ax,word ptr MyString
mov word ptr HTime,ax
cmp HTime+1,0
jne next
mov al,HTime
xchg HTime+1,al
mov HTime,' '
next:

xor eax,eax
mov al,byte ptr [ebx].stimestruct.wMinute
invoke crt__ultoa,eax,ADDR MyString,10


mov ax,word ptr MyString
mov word ptr STime,ax
cmp STime+1,0
jne next2
mov STime,al
next2:


ret
LTimep endp


میشه این قسمت کد رو توضیح بدید .هرچی کاملتر باشه بهتره :لبخند:
ممنون

xman_1365_x
چهارشنبه 23 آذر 1390, 11:15 صبح
میشه این قسمت کد رو توضیح بدید .هرچی کاملتر باشه بهتره
این تابع برای گرفتن زمان و تبدیل کردنش به رشته با فرمت خاص هست که نتیجه در آدرس های زیر قرار میگیره

LTimeis db "LocalTime is: "
HTime DB 2 dup (' ')
SymTime db ':'
STime DB 2 dup (' ')
db 0
در ویندوز برای نمایش رشته ها باید رشته ای درست کنیم که به نال ختم میشه(مثلا تابع DrawText که پارامتر خودمون رو بهش ارسال میکنیم)

lea ebx,stime
push ebx
call GetLocalTime
این تابع یک api ویندوز هست که ساعت جاری سیستم رو در ساختمانی که بهش دادیم بر میگردونه
در دستورات زیر مقدار عددی ساعت را با تایع crt__ultoa به رشته تبدیل میکنیم

xor eax,eax
mov al,byte ptr [ebx].stimestruct.wHour
invoke crt__ultoa,eax,ADDR MyString,10
دستورات زیر فرمت خاصی به رشتمون میده و از بافر(MyString) اطلاعات رو در HTime قرار میدیم ،HTime دو بایت در نظر گرفتم برای اینکه ساعت دو رقم داره و در قسمت فرمت برسی میکنم اگر ساعت تک رقمی شده بجای صفر عددی که برابر با نال یعنی انتهای رشته هست اسپیس رو قرار میدم تا ادامه رشته هم نمایش داده بشه میتونین بجای اسپیس کاراکتر 0 قرار بدین

mov ax,word ptr MyString
mov word ptr HTime,ax
cmp HTime+1,0
jne next
mov al,HTime
xchg HTime+1,al
mov HTime,' '
next:
ادامه کد هم به همین صورت برای دقیقه میباشد.
موفق باشی