ورود

View Full Version : سوال: ارایه



mazaher5723
چهارشنبه 20 دی 1391, 08:48 صبح
سلام دوستان این قطعه کد باعث میشه که عددی که وارد کرده بریزه تو cxمی خوام یک ارایه تعریف کنم عددمو ریزه تو خونه دوم اون چکاری رو اانجام بددم ممنون
mov ah, 9
int 21h
mov ah,0ah;
mov dx,cx
int 21

the king
چهارشنبه 20 دی 1391, 15:43 عصر
سلام دوستان این قطعه کد باعث میشه که عددی که وارد کرده بریزه تو cxمی خوام یک ارایه تعریف کنم عددمو ریزه تو خونه دوم اون چکاری رو اانجام بددم ممنون
mov ah, 9
int 21h
mov ah,0ah;
mov dx,cx
int 21

نه، رشته وارد شده رو داخل CX نمی ریزه، داخل حافظه ای می ریزه که CX آدرس حافظه (آفست) اش رو نگهداری می کنه.
خود CX این وسط کاره ای نیست، مهم اینه که قبل از اینکه این سرویس 0Ah وقفه 21h رو فراخوانی کنید آرایه ای آماده کرده باشید.

خانه اول این آرایه باید حداکثر تعداد کاراکتر هایی باشه که سرویس 0Ah می خونه، فرضا اگر در خانه اول مقدار 5 رو ذخیره کرده باشید،
سرویس حداکثر یک رشته 5 کاراکتری از کاربر دریافت می کنه، نه بیشتر. مقدار این خانه رو باید قبل از اینکه وقفه رو فراخوانی کنید تعیین کرده باشید.

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

مقدار خانه های سوم به بعد همان کاراکتر هایی است که کاربر وارد کرده. بعد از آنکه کاراکتر های ورودی ذخیره شد، کد کاراکتر CR (مقدار 13)
در خانه بعدی آرایه ذخیره خواهد شد، پس موقع تعریف کردن آرایه برای این خانه اضافی جا در نظر بگیرید.

تعریف آرایه بصورت مجزا، numMax برای خانه اول، numLen برای خانه دوم و num برای کاراکتر ها، وقتی اسامی هر بخش رو مجزا بنویسید
بعدا کد نویسی براشون ساده تر و خوانا تر میشه :


numMax DB 5
numLen DB ?
num DB 6 DUP(?)


تعریف آرایه بصورت سر هم، اساسا فرقی نمی کنه، اما بعدا موقع کد نویسی خوانایی کد کمتره :


numMax DB 5, ?, 6 DUP(?)


برای مشخص کردن آدرس این حافظه برای سرویس 0Ah وقفه 21h، یا باید از MOV DX, Offset استفاده کنید و یا ,LEA DX که کلا با هم فرق دارند اما
هر دو در این مورد عملکرد شون مشابه خواهد بود :


MOV AH, 0Ah
MOV DX, Offset numMax
INT 21h




MOV AH, 0Ah
LEA DX, numMax
INT 21h

hastel
پنج شنبه 21 دی 1391, 09:35 صبح
نه، رشته وارد شده رو داخل CX نمی ریزه، داخل حافظه ای می ریزه که CX آدرس حافظه (آفست) اش رو نگهداری می کنه.
خود CX این وسط کاره ای نیست، مهم اینه که قبل از اینکه این سرویس 0Ah وقفه 21h رو فراخوانی کنید آرایه ای آماده کرده باشید.

خانه اول این آرایه باید حداکثر تعداد کاراکتر هایی باشه که سرویس 0Ah می خونه، فرضا اگر در خانه اول مقدار 5 رو ذخیره کرده باشید،
سرویس حداکثر یک رشته 5 کاراکتری از کاربر دریافت می کنه، نه بیشتر. مقدار این خانه رو باید قبل از اینکه وقفه رو فراخوانی کنید تعیین کرده باشید.
مقدار داخل خانه دوم قبل از اجرا کردن وقفه مهم نیست، اما بعد از اجرا شدن وقفه مشخص کننده تعداد کاراکتر هایی است که کاربر وارد کرده،
فرضا اگر در خانه دوم آرایه مقدار 3 بود، کاربر 3 کاراکتر وارد کرده.

مقدار خانه های سوم به بعد همان کاراکتر هایی است که کاربر وارد کرده. بعد از آنکه کاراکتر های ورودی ذخیره شد، کد کاراکتر CR (مقدار 13)
در خانه بعدی آرایه ذخیره خواهد شد، پس موقع تعریف کردن آرایه برای این خانه اضافی جا در نظر بگیرید.

تعریف آرایه بصورت مجزا، numMax برای خانه اول، numLen برای خانه دوم و num برای کاراکتر ها، وقتی اسامی هر بخش رو مجزا بنویسید
بعدا کد نویسی براشون ساده تر و خوانا تر میشه :


numMax DB 5
numLen DB ?
num DB 6 DUP(?)


تعریف آرایه بصورت سر هم، اساسا فرقی نمی کنه، اما بعدا موقع کد نویسی خوانایی کد کمتره :


numMax DB 5, ?, 6 DUP(?)


برای مشخص کردن آدرس این حافظه برای سرویس 0Ah وقفه 21h، یا باید از MOV DX, Offset استفاده کنید و یا ,LEA DX که کلا با هم فرق دارند اما
هر دو در این مورد عملکرد شون مشابه خواهد بود :


MOV AH, 0Ah
MOV DX, Offset numMax
INT 21h




MOV AH, 0Ah
LEA DX, numMax
INT 21h

گه بخواهیم مثلا به خونه اول آرایه دسترسی پیدا کنیم؟بعد شمارنده بذاریم برای خونه ی دوم بعد برا خونه سوم و .... که بار این کار بخواهیم آرایه پر کنیم اونوقت باید چیکار کنیم؟؟