View Full Version : سوال: نمایش (چاپ) محل اشاره گر ماوس در هر لحظه در اسمبلی
Bvk_programmer
یک شنبه 21 اردیبهشت 1393, 15:07 عصر
درود دوستان ، میخواستم برنامه ای بنویسم که ) محل اشاره گر ماوس در هر لحظه رو چاپ کنه وقتی ماوس رو تکون میدم .
ممنون میشم راهنمایی کنید و یا کدی رو در اختیارم قرار بدید .
vahid-p
یک شنبه 21 اردیبهشت 1393, 19:13 عصر
طبق کدی که در پیغام خصوصی نوشتید، کمی تغییرش دادم. مقدار x,y تا سه رقم رو نشون میده. البته میشه مرتب تر و بهتر نوشت، ولی اینم همون کاری رو که میخوای انجام میده :
.MODEL SMALL
.STACK
db 100
.DATA
X DW 0
Y DW 0
T DW 0
.CODE
MAIN PROC
mov ax,1
int 33h
mov ax,3
label1:
int 33h
MOV X,CX
MOV Y,DX
MOV AX,X
CALL PRINT
MOV AX,Y
CALL PRINT
MOV CX,30 ;for delay
LABEL2:
ADD AX,AX
LOOP LABEL2
MOV DL,08
MOV AH,02
INT 21H
INT 21H
INT 21H
INT 21H
INT 21H
INT 21H
INT 21H
INT 21H
mov ax,3
jmp label1
MOV AX,4C00H
INT 21H
MAIN ENDP
PRINT PROC
MOV BX,0
MOV CL,100
DIV CL
MOV DL,AL
MOV BL,AH
ADD DL,'0'
MOV AH,02
INT 21H
MOV AX,BX
MOV CL,10
DIV CL
MOV DL,AL
MOV BL,AH
ADD DL,'0'
MOV AH,02
INT 21H
MOV DL,BL
ADD DL,'0'
MOV AH,02H
INT 21H
MOV DL,' '
INT 21H
MOV AX,0
MOV BX,0
MOV CX,0
MOV DX,0
RET
PRINT ENDP
END MAIN
فقط اونجا که mov cx,30 نوشتم رو میتونید آخرین حدش 65535 بذارید. چون اگر فایل اجراییش رو با dosbox اجرا کنید، سرعت اجرا خیلی خیلی بالاتره و ایجاد تاخیر با 30 خیلی کمه و اینقدر سریع عوض میشه که شما هیچی نمیتونید ببینید.
vahid-p
یک شنبه 21 اردیبهشت 1393, 19:14 عصر
راستی اون اینتراپت هایی که استفاده کرده بودی، منتظر ورودی از کیبورد میمونه، که من اونا رو حذف کردم و نیازی نبود به نظرم.
Bvk_programmer
یک شنبه 21 اردیبهشت 1393, 19:24 عصر
بی نهایت سپاس گزارم فقط اگر ممکن یه توضیح کوتاه نیم خطی در مورد برنامه بدی مثلا : الان T اینجا چیکار میکنه ؟ ممنون میشم
vahid-p
دوشنبه 22 اردیبهشت 1393, 21:39 عصر
اون T متغیر اضافست. فراموش کردم پاکش کنم.
در مورد اون 7 تا Int هم برای Backspace هست و میتونید تو یه loop اینکار رو انجام بدید. مثلا
mov cx,7
backloop:
int 21h
loop backloop
Bvk_programmer
سه شنبه 23 اردیبهشت 1393, 19:36 عصر
دوست عزیز ببخشید یه چند تا سوال در رابطه با کار کدهای زیر پیش اومده که میخواستم ببینم دقیقا چه کاری رو انجام میدهند :
1- این کد ها دقیقا چه کاری انجام میدهند مثلا : لیبل 2 کارش جمع زدن مقدار AX چرا ؟
2-ِ ثبات DL چرا مقدار 8 گرفته و ثبات CX =7 ؟؟؟؟
3- این حلقه BACKLOOP آیا برای پاک کردن موقیعت قبلی هست و بروزرسانی موقعیت جدید آیا ؟
4- MOV AX,3 برای سه رقمی بودن مقدار نمایش جاری هست ؟
LABEL2:
ADD AX,AX
LOOP LABEL2
MOV DL,08
MOV AH,02
MOV CX,7
BACKLOOP:
INT 21H
LOOP BACKLOOP
INT 21H
MOV AX,3
این تابع POSITION رو هم کلا سر در نیاوردم ازش که چرا مثلا مقدار BX=0 یا CL =100 و .... ممنون میشم اگر یک توضیح نیم خطی برای هر خط بفرمایید
بی نهایت سپاس گزارم .
با تشکر
POSITION PROC
MOV BX,0
MOV CL,100
DIV CL
MOV DL,AL
MOV BL,AH
ADD DL,'0'
MOV AH,02
INT 21H
MOV AX,BX
MOV CL,10
DIV CL
MOV DL,AL
MOV BL,AH
ADD DL,'0'
MOV AH,02
INT 21H
MOV DL,BL
ADD DL,'0'
MOV AH,02H
INT 21H
MOV DL,' '
INT 21H
MOV AX,0
MOV BX,0
MOV CX,0
MOV DX,0
RET
POSITION ENDP
vahid-p
سه شنبه 23 اردیبهشت 1393, 20:24 عصر
1 - کامنتی که جلوش گذاشتم توضیح کافی رو داده. نوشتم for delay . یه تاخیر نرم افزاریه که یک حلقه رو CX بار تکرار میکنه و برا اینکه یکم تاخیر بیشتر بشه مثلا گفتم ثبات AX رو جمع بزنه. میتونستی بگی ضرب کنه. چیز خاصی نیست.
2و3- برای اینکه بفهمی ثبات DL چرا 8 گرفته، به فانکشنش نگاه کن int 21h/02 . یعنی یه کاراکتر رو درج کن. کاراکتر با کد اسکی 8 همون Backspace هست. یعنی کاراکترهایی که تا الان نوشته شدن رو پاک میکنه. چون جمعا 7 کاراکتر هست، 7 بار اینکار رو تکرار میکنه.
4- نخیر. Mov ax,3 و INT 33H فانکشن گرفتن موقعیت موس. نگاه کنید این لیبل همینکار رو میکنه دیگه.
ضمنا اون procedure هم print بود تبدیلش کردین به position داره عدد رو نشون میده. عدد چون 3 رقمیه برای رقم اول تقسیم بر 100 کردیم تا عددمون به دست بیاد، باقیمانده همون تقسیم بر 10 رقم دوم و باقیموندش میشه رقم سوم. میتونستی چهار رقمی هم بنویسی.
موفق باشید
Bvk_programmer
سه شنبه 23 اردیبهشت 1393, 21:33 عصر
با سپاس فراوان از پاسخگویی شیوا و رسا شما دوست عزیز ، فقط یک چیزی اگر بخوام قبل از نمایش عدد محورها یک کاراکتر X و کاراکتر Y چاپ بشه چه کنم ؟؟ هر کاری کردم به مشکل برخورد در نمایش
مثلا : اینطوری :
X : 160 Y : 56
vahid-p
یک شنبه 28 اردیبهشت 1393, 01:55 صبح
اینکه خیلی سادست. کاراکتر رو میتونی با فانکشن Int 21h/2 بنویسی. یعنی
mov ah,02
mov dl,'X'
int 21h
اینو تو Print بنویس.
Bvk_programmer
یک شنبه 28 اردیبهشت 1393, 08:54 صبح
اینکه خیلی سادست. کاراکتر رو میتونی با فانکشن Int 21h/2 بنویسی. یعنی
mov ah,02
mov dl,'X'
int 21h
اینو تو Print بنویس.
ممنون دوست عزیز ، بله ساده هست ولی با مشکل مواجه میشه وقتی مینویسم ببینید :
119161
vahid-p
دوشنبه 29 اردیبهشت 1393, 00:05 صبح
خب ببین اون جا بود که یه loop بود و 7 بار کاراکتر 08 یعنی backspace رو تکرار میکرد، خب اونو باید درستش کنی. مقادیرش رو زیاد کن، هر وقت درست شد، همونی هست که میخوای.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.