PDA

View Full Version : نیاز به کمک در کاربرد چند خط از برنامه



laveran
سه شنبه 30 خرداد 1391, 13:13 عصر
سلام . این برنامه را با همکلاسی ام نوشتم اما الان بهش دسترسی ندارم تا سوالمو بپرسم وباید برنامه را سر جلسه امتحان به استاد تحویل بدم برنامه چنینه که یک عدد چند رقمی از ورودی بگیره به اندازه ی مقدار ورودی در صفحه ی نمایش ستاره چاپ کنه. مثلا اگه ورودی را 3 دادیم ستاره در 3 سطر به این شکل چاپ بشه



*



**



***



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





.model small
.stack 64
.data

h1 db 'please enter a number: $'
h2 db 13,10,'$'
adad dw 0

j DW 1

.code
main proc far

mov ax, @data
mov ds, ax
mov es, ax

;For text print
lea dx,h1
mov ah,09
int 21h

;For data input
begin1:
mov ah,01h
int 21h

cmp al,13
je k

sub al,48
mov bl,al
mov ax,10
mul adad
add ax,bx
mov adad,ax
jmp begin1

k:

mov bx,adad
mov cx,1

mov ah,02h
mov bh,00
mov dh,05
mov dl,00
int 10h

a1:
cmp cx,bx
ja c

mov dx,1
mov j,dx

p:

cmp j,cx
ja q

mov ah,02h
mov dl,’*’
int 21h

inc j
jmp p

q:

lea dx,h2
mov ah,09
int 21h

inc cx

jmp a1

c:

mov ax, 4c00h
int 21h

main endp
end main



در این دستور 13 کد کلید اینتره که به سطر بعدی میره اما چرا با alمقایسه میکنیم؟؟








cmp al,13h
je k



مورد بعدی این دستوره



mov dx,1
mov j,dx



1 را داخل dx میریزه و dx میشه یک و بعد در دستور بعدی یک را داخل j میریزه j هم میشه یک که در بالای برنامه مقدار j را یک تعریف کرده بودیم... چرا این دو تا دستور را نوشتیم؟؟ کاربردشون چیه استاد همینو ازم پرسید و من گفتم اگه این دستور را ننویسیم ستاره به مقدار ورودیمون در اِن سطر چاپ میشه اما به ستون اضافه نمیشه.. استاد هم گفت کامل نیست ... من که گیچ شدم :اشتباه: دقیقا کاربرد این دستور چیه؟؟ برای چی این دستورو نوشتیم؟؟ اگه توضیح بدید ممنون میشم.

بهزاد علی محمدزاده
سه شنبه 30 خرداد 1391, 15:39 عصر
سلام . ببینید در دستور اولی که متوجه نشدید چرا با al مقایسه می کنه چون شما وقتی از وقفه های استفاده می کنید اینها بصورت پیش فرض بعضی نتایج و در بعضی از رجیستر ها قرار میدن :


mov ah,01h
int 21h



دستور بالا بطور پیش فرض کد اسکی که از ورودی میگیره رو داخل al میریزه و این قانون خودشه .

مثلا میگه با وقفه ایی که یه حرف رو روی نمایشگر نشون میده حرف u را نشان دهید .



mov dl,'u'
mov ah,2
int 21h


قانون کار این دستور اینه که میره ببینه چه حرفی توی dl هست اون و نمایش میده . و شما باید کاراکتر مورد نظرت و داخل ثبات DL بذاری .

برای دستور دوم من نمی دونم منظورش چی بوده چون میشد از آدرس دهی به اصطلاح بلافصل استفاده کرد یعنی 1 و بده به J بدون واسطه ثبات .

laveran
چهارشنبه 31 خرداد 1391, 00:12 صبح
ممنون از راهنماییتون
همانطور که گفتید دستور MOV ah,01h کد اسکی میگیره اما دستور بالا cmp al,13h که اینتر را با al مقایسه میکنه چیکار میکنه؟؟ چرا با 13h مقایسه کردیم؟؟

xman_1365_x
پنج شنبه 01 تیر 1391, 21:42 عصر
ممنون از راهنماییتون
همانطور که گفتید دستور MOV ah,01h کد اسکی میگیره اما دستور بالا cmp al,13h که اینتر را با al مقایسه میکنه چیکار میکنه؟؟ چرا با 13h مقایسه کردیم؟؟

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

موفق باشید