PDA

View Full Version : سوال: مشکل در کار با اندیس آرایه



armin0282
دوشنبه 26 اردیبهشت 1390, 22:59 عصر
2تا آرایه دارم می خوام مقدار آرایه اولی رو برابر اندیس آرایه دومی شه

واسه درک بهتر با مثال می گم . یه پروژه دارم این قسمت رو گیر کردم.!!

array1 => 4,5,2,3,1
array2 db 5 dup (?)
array2 => 0 - 0 - 0 - 0 - 0

می خوام مقدار آرایه1 که 4 هست رو تو یه متغییر مثل a قرار بده بعد اندیس a آرایه2 رو با 1 add کنم.

این قسمتی از counting sort هست که من مشکل دارم!1

اگه کمکی میتونید بهم کنید ممنون !

Younes
چهارشنبه 28 اردیبهشت 1390, 12:19 عصر
سلام من كه متوجه نشدم شايد ديگران هم متوجه نشدند كه جواب نداده اند

armin0282
پنج شنبه 29 اردیبهشت 1390, 20:37 عصر
سلام سعی کردم با عکس منظورم رو برسونم،امیدوارم این دفعه جواب سوالم رو بگیرم به استاد درس زبان ماشین هم این قضیه رو گفتم اما موند چی بگه!!! خواهشن یک نگاه به تصویری که ضمیمه کردم بندازید ، می خوام دلیل سوالی که کردم رو هم بدونم ممنون میشم!

این سوال رو از استاد زبان ماشین هم پرسیدم اما گفت دلیلش رو نمدونم و شاید بخاطره اینه که برنامه emulator کرک شده داری این جواب رو میده ولی من فکر نمی کنم اینطور باشه!!!

unknown.unforgiven
پنج شنبه 29 اردیبهشت 1390, 21:16 عصر
LEA SI,Array1 میره آدرسی که array1 شروع شده رو توی si میریزه که بستگی به تعداد کد قبل از تعریف آرایه هم داره. واسه این منظور اصلاً احتیاجی به آدرس نیست. فقط باید یه خونه از آرایه رو بخونی، بریزیش توی رجیستر، بعد هم به درایه مربوط به رجیستر ([Array2[si) یه واحد اضافه کنی

tdkhakpur
پنج شنبه 29 اردیبهشت 1390, 21:28 عصر
خب هر آرایه سک شماره داره اصلا اینکه بنوسید


ad array2[si], 1

درست نیست و si آفست هست نه شماره اندیس.
به این شکل میشه این کار رو انجام داد


lea si, array1
lea di, array2
add byte ptr [si+3], 1
,.
.
.

armin0282
پنج شنبه 29 اردیبهشت 1390, 22:09 عصر
خب هر آرایه سک شماره داره اصلا اینکه بنوسید


ad array2[si], 1

درست نیست و si آفست هست نه شماره اندیس.
به این شکل میشه این کار رو انجام داد


lea si, array1
lea di, array2
add byte ptr [si+3], 1
,.
.
.



شما سوال رو متوجه نشدید 3 یک عدد متغییره که از مقدار اندیس 0 آرایه1 گرفته میشه ممکنه مقدارش 3و4و3و2و1.... باشه می خوام مقداری که در اندیس 0 آرایه 1 هست رو بخونه مثلا اگه مقداری که در اندیس 0 آرایه هست رو x بگیریم اندیس x ارایه 2 با 1 Add شه!!!!

armin0282
پنج شنبه 29 اردیبهشت 1390, 22:12 عصر
LEA SI,Array1 میره آدرسی که array1 شروع شده رو توی si میریزه که بستگی به تعداد کد قبل از تعریف آرایه هم داره. واسه این منظور اصلاً احتیاجی به آدرس نیست. فقط باید یه خونه از آرایه رو بخونی، بریزیش توی رجیستر، بعد هم به درایه مربوط به رجیستر ([Array2[si) یه واحد اضافه کنی

اگه میشه یکم بیشتر توضیح بدید اگه هم ممکنه با کد توضیح بدید!

xman_1365_x
پنج شنبه 29 اردیبهشت 1390, 22:21 عصر
همانطور كه آقاي خاكپور گفتن شما دارين مقدار آفست آرايه اول رو با آفست آرايه 2 جمع ميكنيد و جايي جلوتر از حافظه رو مقدارشو تغيير ميدين:لبخند:
براي كاري كه ميخواين انجام بدين ميتونيد از اين روش استفاده كنيد.


org 100h

jmp start
array1 db 3,4,5,1,3,4,5,7,8
array2 db 0,0,0,1,0,0,0,0,0
start:

lea si, array1
lea di, array2
mov bl,byte ptr [si] ;move array1[0] value to bx=3
add di[bx], 1 ; equal to: array2[bx]

;input:
; araay1[0] = 3
;calculate:
; array2[3] + 1 = 2
;output:
; array2 db 0,0,0,2,0,0,0,0,0

ret

موفق باشي

unknown.unforgiven
پنج شنبه 29 اردیبهشت 1390, 22:33 عصر
نمیدونم منظورتون رو درست متوجه شدم یا نه ولی احتمالاً این رو میخواید

jmp c
arr1 db 1,2,4,6,5,3
arr2 db 6 dup(0)
c:
mov cx,6
mov bx,0
re:
mov al,arr1[bx]
cbw
dec ax
mov si,ax
inc arr2[si]
inc bx
loop re

armin0282
جمعه 30 اردیبهشت 1390, 01:47 صبح
همانطور كه آقاي خاكپور گفتن شما دارين مقدار آفست آرايه اول رو با آفست آرايه 2 جمع ميكنيد و جايي جلوتر از حافظه رو مقدارشو تغيير ميدين:لبخند:
براي كاري كه ميخواين انجام بدين ميتونيد از اين روش استفاده كنيد.


org 100h

jmp start
array1 db 3,4,5,1,3,4,5,7,8
array2 db 0,0,0,1,0,0,0,0,0
start:

lea si, array1
lea di, array2
mov bl,byte ptr [si] ;move array1[0] value to bx=3
add di[bx], 1 ; equal to: array2[bx]

;input:
; araay1[0] = 3
;calculate:
; array2[3] + 1 = 2
;output:
; array2 db 0,0,0,2,0,0,0,0,0

ret

موفق باشي

درسته منظورم دقیقا همین بود با اجازتون من کد شما رو ساده تر کردم و اینجا می زارم تا دوستان دیگه که منظورم رو متوجه نشدن با دیدن خروجی متوجه بشن!!


org 100h



jmp start

array1 db 3,4,5,1,3,4,5,7,8

array2 db 0,0,0,1,0,0,0,0,0

start:



lea si, array1

mov bl,[si] ;move array1[0] value to bx= index 0 Array1 Value

add array2[bx], 2; equal to: array2[bx]

mov dl,array2[3] ;array2[3]=array2[bx]=array2[index 0 Array1 Value]
add dl,48 ;if array1[0] = 4 or x , array2[4] or array2[x] ADD 1
mov ah,2
int 21h

ret

فقط 2 تا سوال واسم پیش اومد. BX چرا مقدار آرایه1 رو میگره؟ mov bl,[si] ;bx=value array1 ربطش به BX چیه؟؟؟ و دوم اینکه اگه ممکنه در مورد byte ptr هم یه توضیحی بدید!ممنون

xman_1365_x
جمعه 30 اردیبهشت 1390, 03:27 صبح
اين سوال هارو جستجو ميكردين قبلا جواب داده شده
ضمنا شما كه اشنايي دارين بهتره تست كنيد با تست كردن خودتون ميفهميدين چي ميشه
اما توروخدا بهتر توضيح بدين من صدبار خوندم كه فهميدم ، خوندن صورت مسئله سخت تر از خود مسئله بود:اشتباه:


mov bl,byte ptr [si]
mov bx,[si]
mov bx,si

دستور اول: يك بايت از جايي كه si اشاره ميكنه ميخونه انتقال ميده به ثبات
دستور دوم: يك ورد رو ميريخت در bx يعني يك خونه ديگه هم از حافظه ميخوند!
وقتي دارين برنامه مينويسيد اگر حواستون نباشه bx ميزاشتين در اجرا متوجه نميشدين كجا مقدار اشتباه وارد ميشه بعد ديباگش كمي مشكل ميشه بايد همرو چك كنيد
براي همين با بعضي دستورا بازرو محدود ميكنيم و ضمنا توي اسمبلر هاي ديگه نزاشتن اين دستورا خيلي ايراد يگيره ،شما دارين از امولاتور استفاده ميكنيد كه اسمبلرش فلت اسمبلر هست كه خيلي چيزارو ناديده ميگيره و خودش درست ميكنه مثلا در ارتباط با پرش ها پرش هاي دور رو خودش درست ميكنه و اگر برين در اسمبلر هاي ديگه مثل masm & tasm به مشكل ميخورين خيلي دستورات هست كه اينطوره
دستور سوم:كه اشتباه شما بود كه ميومدين آفست رو انتقال ميدادين و با آفست ديگه جمع ميكردين و براي همين نتيجه دلخواه رو نميگرفتين

يه چيزي هم تا يادم نرفته بگم ، دستور منو كوتاه كردين اما موقع كوتاه كردن خودتونم يه بار با يك جمع كردين:لبخند::چشمک:


add array2[bx], 2; equal to: array2[bx]

درستش


add array2[bx], 1


موفق باشي

armin0282
جمعه 30 اردیبهشت 1390, 03:53 صبح
اين سوال هارو جستجو ميكردين قبلا جواب داده شده
ضمنا شما كه اشنايي دارين بهتره تست كنيد با تست كردن خودتون ميفهميدين چي ميشه
اما توروخدا بهتر توضيح بدين من صدبار خوندم كه فهميدم ، خوندن صورت مسئله سخت تر از خود مسئله بود:اشتباه:


mov bl,byte ptr [si]
mov bx,[si]
mov bx,si

دستور اول: يك بايت از جايي كه si اشاره ميكنه ميخونه انتقال ميده به ثبات
دستور دوم: يك ورد رو ميريخت در bx يعني يك خونه ديگه هم از حافظه ميخوند!
وقتي دارين برنامه مينويسيد اگر حواستون نباشه bx ميزاشتين در اجرا متوجه نميشدين كجا مقدار اشتباه وارد ميشه بعد ديباگش كمي مشكل ميشه بايد همرو چك كنيد
براي همين با بعضي دستورا بازرو محدود ميكنيم و ضمنا توي اسمبلر هاي ديگه نزاشتن اين دستورا خيلي ايراد يگيره ،شما دارين از امولاتور استفاده ميكنيد كه اسمبلرش فلت اسمبلر هست كه خيلي چيزارو ناديده ميگيره و خودش درست ميكنه مثلا در ارتباط با پرش ها پرش هاي دور رو خودش درست ميكنه و اگر برين در اسمبلر هاي ديگه مثل masm & tasm به مشكل ميخورين خيلي دستورات هست كه اينطوره
دستور سوم:كه اشتباه شما بود كه ميومدين آفست رو انتقال ميدادين و با آفست ديگه جمع ميكردين و براي همين نتيجه دلخواه رو نميگرفتين

يه چيزي هم تا يادم نرفته بگم ، دستور منو كوتاه كردين اما موقع كوتاه كردن خودتونم يه بار با يك جمع كردين:لبخند::چشمک:


add array2[bx], 2; equal to: array2[bx]

درستش


add array2[bx], 1


موفق باشي

شما به بزرگی خودت ببخش از اینکه منظورم رو خوب نرسوندم.دیگه همه کار کردم . با تصویر توضیح دادم مثال زدم کد گذاشتم.و در مورد این 1 که خودم اضافه کردم داشتم آرایه 2 رو با مقادیر مختلف جمع می بستم که مطمئن شم از جوابی که می گیرم ، دیگه یادم رفت 1 کنمش اصل مطلبی که باید می فهمیدم رو فهمیدم.
و اینکه دستور زیر
mov bl,[si]
این دستور چرا به bx مقدار رو میده. هم bl و هم bx یعنی جفتشون مقدار آرایه 1 رو میگیرن؟؟؟؟! چرا!!
و یه سوال دیگه اگه ما 2 بایت داشته باشیم تو یه آرایه درستور byte Ptr بایت رو از سمت چپ(پر ارزشتر)میگره یا راست (کم ارزشتر)؟؟؟
مرسی.

xman_1365_x
جمعه 30 اردیبهشت 1390, 04:25 صبح
1-بخاطر براكتي كه داره ميره مقدار اونجايي كه اشاره شده ميزاره،شما براكت نذاري ميره آفستشو ميريزه همين.
2-بد نبود امتحان ميكردين؟ با ديدن خروجي متوجه ميشدين:قلب:
اما به هرجا از حافظه اشاره كنيد همون خونرو ميخونه به عنوان بايت كم ارزش و بايت و يا بايت بعدش ميشن پرارزشتر
byte ptr
پس بايت اول رو انتقال ميده
word ptr
هم هر دو بايت رو
dword ptr
چهار بايت
و...


org 100h
jmp start
x dw 0F231h
start:
mov bh,byte ptr x ;bh=31h
mov bx,word ptr x ;bx=F231 , bh=F2 ,bl=31
ret

موفق باشي