View Full Version : اشکال در دستور شیفت
FATEMEH@
جمعه 08 خرداد 1394, 23:20 عصر
سلام من برنامه ای میخام که ی ارایه ده تایی داره و قراره اعداد زوج ارایه را باهم جمع و اعداد فرد را از هم کم کند
اما من برا یادگیری این قطعه کد رو نوشتم اما جواب نمیده اصلا
131785
masoud.8086
شنبه 09 خرداد 1394, 08:46 صبح
سلام ابتدا باید بدونید که شیفت به چپ عدد رو دوبرابر میمنه و شیفت به راست عددو تقسیم به 2.. پس تنها با یک دستور شیفت نمبیشه این برنامه که مد نظر شماس نوشته بشه به نظر من بیا دو تا حلقه تعریف کن یکی برای جمع اعداد زوج و یکی برای کم کردن اعداد فرد..
داخل حلقه اعاداد زوج ی دونه اشاره کر تعریف کن و مقدارشو 0 بذار و بیا با ی متغییر که مقدارش صفر هست جمع کن و بعد مقدار اشارگرتو دو واحد اضافه کن و دوباره جمع تا به انتهای ارایت برسی برای اعداد فرد داخل حلقه دوم مقدار اشارگرو 1 بذار و مثل بالا عمل کن فقط یادت باشه بجای جمع اعدادو کم کنی تابه اخر ارایه برسی.. موفق باشی
reza_noei
شنبه 09 خرداد 1394, 15:57 عصر
سلام
کارتون خوب بود ولی باید یخورده بهتر منطق برنامه را حفظ کنید کد زیر را نگاه کنید :
وقتی که میخواهید حلقه به طور خودکار با مقدار CX کارکند باید از دستور loop بجای jnz استفاده کنید. دستور jnz بر اساس پرچم ZF کار میکند که این پرچم
بر اساس آخرین عمل محاسباتی یا مقایسه دو مقدار تغییر میکند. ولی دستور loop ابتدا یک واحد از CX کم میکند سپس CX را با صفر مقایسه میکند و اگر CX صفر نبود به برچسب مقابلش پرش میکند.
MOV si, OFFSET data1
MOV cx, 10
l2:
MOV al, [si]
SHR al, 1
JC l1
INC c
INC si
loop l2
JMP end
l1 :
DEC c
INC si
loop l2
end :
masoud.8086
شنبه 09 خرداد 1394, 16:54 عصر
دوست عزیز(آقا رضا) کلا روال و منطق برنامه اشتباه است اگر من بالا اینو نگفتم چون با این دستورات نمیشه کاری که این دوست عزیزمون مد نظر داره رو پیاده کرد کد کاملا اشتباه هست و داخل حلقه بینهایت حتی اگر loop بذارید..شما هم بجای ایراد از کد ببینید نویسنده چی خواسته بعد به فکر کمکش باشید.. نه که کدو بیشتر به اشتباه بکشید..بنده هم بالا عرض کردم با این کد نمیتونید برنامه مد نظر را پیاده کنید و راهنمایی هم کردم..
reza_noei
شنبه 09 خرداد 1394, 20:48 عصر
مثل اینکه کد ایشون تعداد اعداد زوج و فرد رو میشماره،منطق برنامه که اینطوره در غیر اینصورت میبایست به جای INC C دستورات دیگری رو ذکر میکردند.
دستور SHR راست ترین بیت عدد را داخل فلگ CF قرار میدهد پس میشود که زوج یا فرد بودن را از طریق آن بررسی کرد حال اگر نمیخواهند تعداد اعداد زوج و تعداد اعداد فرد را مقایسه کنند
اون یه بحث دیگری است.
FATEMEH@
چهارشنبه 13 خرداد 1394, 09:25 صبح
ممنون از دوستان
من اصل برنامه ام اینه که ی ارایه ده تایی داره و قراره اعداد زوج ارایه را باهم جمع و اعداد فرد ارایه را از هم کم کند(تفریق)
بنظر خودم باید از دستور شیفت به راست و باتوجه به مقدار کری فلگ این برنامه رو می توان نوشت
برای اطمینان اول اومدم طبق نظرم ی قطعه کد نوشتم و بجاب عملیات جمع اومدم فقط با یک شمارنده تعداد اعداد رو حساب کردم
میخام ببینم همین روند درسته؟
یعنی بجای شمارنده من دستور ادد بذارم برنامه درست میشه؟
بازم ممنون
masoud.8086
چهارشنبه 13 خرداد 1394, 12:11 عصر
سلام
mov si,0
mov cx,5
p:
mov ax,a[si]
add sum,ax
add si,2
loop p
در اینجا a ارایس
sum=0
FATEMEH@
چهارشنبه 20 خرداد 1394, 10:48 صبح
نگرفتم :متفکر::متعجب::گریه:
masoud.8086
چهارشنبه 20 خرداد 1394, 12:08 عصر
سلام
قطعه کدی که نوشتم داخلش ی حلقه داره عناصر زوج که از صفر شروع میشه(si) رو باهم جمع میکنه ..در این کد A آرایس,مقدار si ادرس شروع ارایه ,مقدار CX تعداد تکرار حلقه,و SUM مقدار جمع عناصرو در خودش نگه میداره..و چون ما میخوایم عناصر زوج ارایه رو با هم جمع کنیم مقدار SI هر بار دو واحد اضافه میکنیم..
Delphi Coder
چهارشنبه 27 خرداد 1394, 01:43 صبح
سلام من برنامه ای میخام که ی ارایه ده تایی داره و قراره اعداد زوج ارایه را باهم جمع و اعداد فرد را از هم کم کند
اما من برا یادگیری این قطعه کد رو نوشتم اما جواب نمیده اصلا
شما توی این کد در حلقه l2 سعی کردید اعداد زوج ارایه رو شمارش کنید و از شمارنده یا متغییری به نام c استفاده کردید یعنی الگوریتم به نظر اشتباه هست اما نحوه تشخیص اعداد زوج و فرد درست هست و با دستور shr و جامپهای شرطی carry flag قابل انجام هست روش معمولتر and کردن عدد با 1 و استفاده از zero flag هست.
به هر حال یک متغییر برای نگهداری مجموع اعداد زوج و یک متغییر برای نگهداری تفاضل اعداد فرد در کد مورد نیاز هست و پس از تشخیص زوج یا فرد بودن باید عملهای جمع یا تفریق بسته به اون انجام بشه.
Delphi Coder
چهارشنبه 27 خرداد 1394, 01:45 صبح
البته استفاده از دستور test بهتر هست چون فقط روی فلگها تاثیر میزاره و به خود متغییر (پارامتر) کاری نداره.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.