Screensaver با اسمبلی

jingile

New Member
دوستان عزیزسلام:)
باید یه Screensaver با اسمبلی بنویسم اما نمیدونم از چه وقفه ای باید استفاده کنم که زمان رو بشناسه و برنامه نوشته شده ی Screensaver رو اجرا کنه و با چه دستوری از برنامه خارج بشه و به صفحه ی اصلی برود البته برنامه فقط به صفحه کلید حساس است.
ممنون میشم کمک کنید خیلی فوریه:cry:
 

saalek110

Well-Known Member
کد:
.model small
.stack 
.data 
.code 
asli proc
;---------------------------
;INT 1Ah / AH = 00h - get system time.

;return:

;CX:DX = number of clock ticks since midnight.
;AL = midnight counter, advanced each time midnight passes.

;Notes:
;There are approximately 18.20648 clock ticks per second,
;and 1800B0h per 24 hours. 
;AL is not set by emulator yet! 
;----------------------
mov ah,2
int 1ah

mov bl,ch
call bl_print
mov bl,cl
call bl_print
;------
push dx
push ax
mov ah,2
mov dl,'-'
int 21h
pop ax
pop dx
;------
mov bl,dh
call bl_print
mov bl,dl
call bl_print
;------
push dx
push ax
mov ah,2
mov dl,'-'
int 21h
pop ax
pop dx
;------
mov bl,al
call bl_print

;---------------------------
mov ax,4c00h ; return to dos DOS 
int 21h 

asli endp
; ============ sub bl_print ===========
bl_print PROC NEAR
push ax
push bx
push cx
push dx
;----------part 1
mov ah,2h
mov dl,bl  

mov cl,04h
shr dl,cl

add dl,30h

cmp dl,3ah
jl lable1

add dl,07h

lable1:
int 21h

; -----------part 2

mov dl,bl
and dl,0fh

add dl,30h

cmp dl,3ah
jl lable2

add dl,07h

lable2:
int 21h
;------------
pop dx
pop cx
pop bx
pop ax

ret ; return to where it was called
bl_print ENDP
;===================================

     end asli

کامنت را بخوان فکر کنم واضح باشه.

برای نمایش بهتر حلقه اش کردم. کد زیر:
کد:
.model small
.stack 
.data 
.code 
asli proc
;---------------------------
;INT 1Ah / AH = 00h - get system time.

;return:

;CX:DX = number of clock ticks since midnight.
;AL = midnight counter, advanced each time midnight passes.

;Notes:
;There are approximately 18.20648 clock ticks per second,
;and 1800B0h per 24 hours. 
;AL is not set by emulator yet! 
;----------------------
lablexxx:
mov ah,2
int 1ah

mov bl,ch
call bl_print
mov bl,cl
call bl_print
;------
push dx
push ax
mov ah,2
mov dl,'-'
int 21h
pop ax
pop dx
;------
mov bl,dh
call bl_print
mov bl,dl
call bl_print
;------
push dx
push ax
mov ah,2
mov dl,'-'
int 21h
pop ax
pop dx
;------
mov bl,al
call bl_print
;============
mov dh,0  ;DH = row. 
mov dl,0  ;DL = column.
mov ah,2  ;service
int 10h 
jmp lablexxx
;===========
;---------------------------
mov ax,4c00h ; return to dos DOS 
int 21h 

asli endp
; ============ sub bl_print ===========
bl_print PROC NEAR
push ax
push bx
push cx
push dx
;----------part 1
mov ah,2h
mov dl,bl  

mov cl,04h
shr dl,cl

add dl,30h

cmp dl,3ah
jl lable1

add dl,07h

lable1:
int 21h

; -----------part 2

mov dl,bl
and dl,0fh

add dl,30h

cmp dl,3ah
jl lable2

add dl,07h

lable2:
int 21h
;------------
pop dx
pop cx
pop bx
pop ax

ret ; return to where it was called
bl_print ENDP
;===================================

     end asli

زیر برنامه bl_print برای نمایش است فقط.
در تاپیک:

پیوند و اجرای اسمبلی

شرح کدهایش را داده ام.
 

zahra85

Member
ممنون از سورسي كه در اختيار گذاشتيد

ولي ميشه اجراي برنامه را هم قرار بدي كه نتيجه برنامه را مشاهده كنيم

و همچنين در مورد pushها و popها هم توضيح بدهي

با تشكر
 

saalek110

Well-Known Member
http://saalek110.250free.com/rars/time.rar
فایل بالا شامل هر دو exe کدهای بالا است.
در مورد کدها فقط از وقفه ای که در کامنت ها گفته شده استفاده شده. چند خط اصل برنامه است. بقیه برنامه برای دیدن رجیسترها است تا بدانیم چه اتفاقاتی افتاده.
کل قسمت نمایش دهنده مفصل در تاپیک پیوند و اجرای اسمبلی گفته شده.
راجع به push ها و pop یک قانون است که قبل هر تغییری روی رجیسترها اگر می خواهید آنها محتوایشان حفظ شود ... قبل تغییر به پشته ارسال می شود و بعد استفاده از رجیسترها برای بازیابی باز از پشته pop می شود.
و همان طور که می دانید پشته مثل سینی های روی هم چیده شده است. یعنی اونی که اول می گذاری آخر می توانی برداری. پس ترتیب push و pop هم به همین شکل است.
 

zahra85

Member
لطفا يك بار ديگر لينك خود را قرار دهيد (لينكتون درست كار نمي كنه) و در مورد اينكه اسكرين سيور كلمه باشد هم يه كمي توضيح بديد كه چي كار كنم. براي ايجاد تاخير و حساس به صفحه كليد توضيح بديد براي ايجاد تاخي مي توان از اين كد استفاده كرد :
delay:
mov r2,#05fh
loop3:mov r1,#0ffh
loop2:mov r0,#0ffh
loop1:djnz r0,loop1
djnz r1,loop2
djnz r2,loop3
ret

لطفا راهنمايي كنيد
 

saalek110

Well-Known Member
همه چیزهایی که لازم دارید را در تاپیک پیوند و اجرای اسمبلی من گفته ام.
اگر من خودم بخوام این برنامه را بنویسم... اول ساعت را می خوانم تا باعث بشه یک رجیستر زمان را بشمرد. که برنامه بالا این کار را می کند. بعد میرم ببینم کدام وقفه ورودی کیبورد می گیرد. هر وقت ورودی گرفته شد رجیستری که زمان را می شمرد را صفر می کنم. چون که یعنی کاربر دکمه ای را زده و ظهور اسکرین سیور باید به تاخیر بیافتد.
حلقه های تو در تو را هم در آن تاپیک مفصل بحث کرده ایم. ولی نمی دونم تاخیر را برای چه می خواهید. چون اسکرین سیور به ورودی صفحه کلید حساسه. هم برای شروع شدن برنامه و هم قطع اسکرین سیور. البته اگر درست فکر کرده باشم. یعنی با نگرفتن ورودی از کاربر بعد مدتی شمارش زمان .... اسکرین سیور شروع میشه و به محض زدن کلیدی توسط کاربر اجرای اسکرین سیور قطع میشه.
راجع به نمایش رشته هم باز در تاپیک گفته شده.
من اگر بخوام توضیح بدم خیلی طولانی میشه. چون باید کل اون تاپیک را دوباره بگم. اگر خواستید قرار بگذارید با چت بگم. با پیام خصوصی قرار را تنظیم کنید من حاضر می شوم. مسنجر یاهوی من saalek111 است. فقط بگید سر چه ساعتی بیام من همان ساعت میام.
 

saalek110

Well-Known Member
کد:
.model tiny 
.code 
org 100h
Start:


call Display_Hi ; Call the procedure
mov ax,4C00h ; return to DOS
int 21h 


Display_Hi PROC 

mov dx,OFFSET HI 
mov ah,9 
int 21h 

ret
Display_Hi ENDP 

HI DB "Hello World!$" ; define a message

end Start
با سرویس 9 وقفه 21 گویا رشته را چاپ می کنند.
الان در هاردم می گشتم این کد را که قدیم ها کار کرده ام پیدا کردم. انگار برنامه اسکلتش com است نه exe . ولی اگر با ساختار و اسکلت کار نداشته باشیم باید این برنامه کار کند یعنی hello world را چاپ کند.

--------------
الان برای ساختن برنامه exe اش کار کردم.
با کمک گیری از این پست:
http://forum.majidonline.com/showpost.php?p=425328&postcount=42
این کد برنامه تست شده من است. که با tasm تبدیل کردم.
کد:
.model small
.stack 
.data 
.code 
asli proc



mov dx,OFFSET HI 
[COLOR="Blue"]mov ax,SEG HI 
mov ds,ax[/COLOR]
mov ah,9 
int 21h 


mov ax,4c00h ; return to dos DOS 
int 21h 

asli endp


HI DB "Hello World!$" ; define a message


     end asli
 

جدیدترین ارسال ها

بالا