# برنامه نویسی سطح پایین > برنامه نویسی اسمبلی خانواده x86 >  نشان دادن ساعت سیستم

## majid1605

من می خوام برنامه ایی بنویسم که ساعت سیستم رو نمایش بده البته توی MASM32 یعنی یه پنجره کوچولو رو با استفاده از API های ویندوز ایجاد و ساعت رو نشون یده می خواستم بدونم امکان چنین کاری وجود داره ؟
و اینکه چطور میشه اینکار رو کرد یعنی اگه تابعی داره ممنون میشم بگید چیه و چطور فراخوانیش کنم

----------


## #target

تابع GetLocalTime یا GetSystemTime 
قبلش هم کافیه  SYSTEMTIME آدرسشو Push کنی 

http://msdn.microsoft.com/en-us/libr...(v=VS.85).aspx
http://msdn.microsoft.com/en-us/libr...(v=VS.85).aspx
http://msdn.microsoft.com/en-us/libr...(v=VS.85).aspx

----------


## majid1605

راستش من تازه برنامه نویسی اسمبلی رو شروع کردم و تازه ساخت پنجره ویندوز و یا نشون دادن اونو یاد گرفتم حالا می خوام ساعت رو هم داخلش نشون بدم .میشه یه نمونه از به کار گیری اون تابع رو برام بزارید.و چطور ادرسش رو push کنم ممنن میشم

----------


## xman_1365_x

> راستش من تازه برنامه نویسی اسمبلی رو شروع کردم و تازه ساخت پنجره ویندوز و یا نشون دادن اونو یاد گرفتم حالا می خوام ساعت رو هم داخلش نشون بدم .میشه یه نمونه از به کار گیری اون تابع رو برام بزارید.و چطور ادرسش رو 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

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

----------


## xman_1365_x

> من فقط می خوام اسمبلی رو تا حدی یاد بگیرم که بتونم یه پرژه تحویل بدم و می خوام تا حد زیادی خودم روش کارکنم تا اینکه بدم یه نفر .
> در مورد API های ویندوز باهشون آشنایی نسبی دارم البته توی ++C ، چیزی که توی اسمبلی هم دیدم تقریباً مثل هم هستند.
> ولی اسمبلی رو خیلی ضعیف هستم
> ممنون


 خوب برای یادگیری اسمبلی کتاب های زیادی هست که باید مطالعه کنید(یک جستجو توی گوگل) در نهایت بیاین سراغ api ها البته هنگامی که تحت کنسول توی ویندوز کار کنید بیشتر از api های kernel32 استفاده میکنید که گرفتن زمان هم جزء توابع همین کتابخانه هست.
لینک زیر هم بعدا بدرتون میخوره راهنمای api داره که خیلی خوبه و همینطور مثال های زیادی
http://win32assembly.online.fr/tutorials.html
موفق باشی

----------


## xman_1365_x

تحت کنسول رو براتون نوشتم ،چون میدونم بدرد دوستان دیگه هم میخوره 

نکات آموزشی که داره:
 استفاده از ساختمان
استفاده از توابع ویندوز (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

ممنون 
متاسفانه بعد از کامپایل فایل EXE برام اجرا نمیشه بدون هیچ خطایی یعنی وقتی روش کلیک می کنم هیچ اتفاقی نمیفته به خاطر 64 بیتی بودن ویندوزمه؟

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

----------


## xman_1365_x

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


 مشکل اینه تحت کنسول اجراش نکردین فقط دابل کلیک کردین ، سیستم عامل من هم 64 بیتی هست ، وقتی دابل کلیک میکنید سریع اجرا میشه و بسته میشه
برای اینکه با دابل کلیک هم قابل مشاهده باشه
این خط رو حذف کنید از آخر 
print chr$(13,10)
و بجاش این خط رو جایگزین کنید
mov   eax, input(13,10,"Press enter to exit...")
موفق باشی

----------


## majid1605

این بار هم اجرا نمیشه پنجره پیغام ویندوز 7 میاد همون که میره واسه چک کردن

----------


## xman_1365_x

> این بار هم اجرا نمیشه پنجره پیغام ویندوز 7 میاد همون که میره واسه چک کردن


فایل اجرایی به همرا سورس و... رو آپلود کردم ، ببینید فایل اجرایی خطا میده یا نه؟
time.rar

----------


## majid1605

نه درست کار می کنه چرا توی سیستم من خطا میده؟
اون ساعت سیستم چیه ؟

----------


## xman_1365_x

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


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




> نه درست کار می کنه چرا توی سیستم من خطا میده؟


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



> اون ساعت سیستم چیه ؟


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

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

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

----------


## majid1605

در مورد آموزش ها که یا ناقص هستند یا خیلی قدیمی 16 بیتی کتابی هم که پیدا کردم همینطوره .مطمئناً در مورد مطالب آموزشی خیلی ها هم هستند که دنبال مطالب اموزشی جدید هستند .
معمولاً خودم اگه چیزی بلد باشم یه جوری مطلب رو میزارم که بقیه هم متوجه بشن نمونش هم توی سات خودم موجوده و به این هم کاری ندارم که قبلاً ارائه شده و یا اینکه کاربری ممکنه نیاد بخوندش.
به هر حال شما مختارید و ممکنه وقتش رو هم نداشته باشید.

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

----------


## xman_1365_x

> در مورد آموزش ها که یا ناقص هستند یا خیلی قدیمی 16 بیتی کتابی هم که پیدا کردم همینطوره .مطمئناً در مورد مطالب آموزشی خیلی ها هم هستند که دنبال مطالب اموزشی جدید هستند .
> معمولاً خودم اگه چیزی بلد باشم یه جوری مطلب رو میزارم که بقیه هم متوجه بشن نمونش هم توی سات خودم موجوده و به این هم کاری ندارم که قبلاً ارائه شده و یا اینکه کاربری ممکنه نیاد بخوندش.
> به هر حال شما مختارید و ممکنه وقتش رو هم نداشته باشید.
> 
> در مورد پروژه من گفتم که اگه همون تاریخ رو هم نشون بده ولی به صورت گرافیکی بزارید خیلی خوب میشد و در موردش یه توضیحی بدید 
> و اگه تونستم ساعت رو به صورت گرافیکی بنویم میزارمش همین جا واسه بقیه .


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

----------


## majid1605

.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

> 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

.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

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


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

----------


## majid1605

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

چندتا سوال 

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



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

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

ممنون

----------


## xman_1365_x

> این ماکرو رو واسه چی تعریف کردید؟


گفتم که چه قسمتهایی رو پاک کنید!
و  ماکرو کارش اینه مثلا میخواین به مسیج باکس بنویسید برای اینکه هی نرین توی دیتا سگنت آدرس بزارین یه رشته همونجا مینویسین این ماکرو خودش در دیتا سگمنت قرار میده ، اما همونطور که در پست قبل گفتم نیازی نیست پاکش کنید



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


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



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


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

----------


## majid1605

.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

توی خط 35 و 36 دوتا متغیر تعریف کردم البته میدونم جاشون اشتباه است :لبخند گشاده!: 

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

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

----------


## majid1605

ممنون میشم بگید کجای کار رو اشتباه کردم.



.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

برای رفع مشکلتون با تابع CreateWindowEx به این لینک سر بزنید و پارامتر ها رو بررسی کنید مشکلتون حل میشه

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

موفق باشید

----------


## majid1605

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

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


این تابع برای گرفتن زمان و تبدیل کردنش به رشته با فرمت خاص هست که نتیجه در آدرس های زیر قرار میگیره
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:
ادامه کد هم به همین صورت برای دقیقه میباشد.
موفق باشی

----------

