PDA

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



M.amin
یک شنبه 04 دی 1390, 15:32 عصر
یه رشته ای رو از کاربر دریافت کردیم و میخواهیم که اولین کاراکتر رو با آخرین کاراکتر در رشته رو مقایسه کنه و اگه مثل هم بودند با یه پیغام اعلام کنه .

مشکلی که من دارم مقایسه کردن اولین کاراکتر با آخرین کاراکتر هستش .
دوستان می تونند راهنمایی کنند ؟

M.amin
دوشنبه 05 دی 1390, 17:12 عصر
دوستان کسی راه حلی به ذهن اش نمیرسه .
اگه اولین عنصر Buffer رو درون یک ثبات بریزیم و بعد اگه بخواهیم با اندیس دادن به Buffer آخرین عنصر رو با ثبات مقایسه کنیم . به نظرتون عملی هست !

xman_1365_x
دوشنبه 05 دی 1390, 17:45 عصر
فقط کافیه یک اشاره گر به ابتدا بافر و دیگری به انتهای بافر اشاره کنه بعد مقایسه کنید
برای این کار یک ثبات مشترک برای نگهداری آدرس شروع و برای رفتن به انتها هم طول بافر رو در ثبات bx قرار بدین و مقایسه کنید ، همین
موفق باشی

M.amin
سه شنبه 06 دی 1390, 12:15 عصر
من به این شکل نوشتم ولی کار نمیکنه

mov cl,buf[bx]
mov bx,0
mov bl,buf[bx]
cmp cl,bl
je Label_1

pe32_64
سه شنبه 06 دی 1390, 16:05 عصر
من برنامه تون رو تصحیح کردم:

"buf db "MARYAM
len db 6


mov bx,len-1
mov cl,[buf+bx]
mov bx,0
mov bl,[buf+bx]
cmp cl,bl
je Label_1

xman_1365_x
سه شنبه 06 دی 1390, 19:02 عصر
من برنامه تون رو تصحیح کردم:
فقط این خط سوم رو هم باید اصلاح کنید

xor bx,bx
mov bl,len-1
و نیازی به خط پنجم نیست و در خط ششم هم به bx فقط کاربردی که میتونه داشته باشه بخواین عناصر دیگه ای هم بررسی کنید که برای کم کردن دستورات باید از si,di کمک بگیرین

pe32_64
سه شنبه 06 دی 1390, 20:43 عصر
جناب xman_1365_x (http://barnamenevis.org/member.php?33193-xman_1365_x) ، آیا منظورتون این بود؟

buf db "MARYAM"
len db 6

mov si,buf
mov di,buf+len-1
cmpsb
je Label_1

البته من خواستم کمترین تغییرات رو به کدشون بدم

xman_1365_x
سه شنبه 06 دی 1390, 22:52 عصر
آیا منظورتون این بود؟
نه منظورم این نبود،این کدتون اشتباه هست. کد قبلی هم دستور mov bx,len-1 اشتباه هست حواسم نبود شما از آدرس کم کردین نه مقدار و نمیتونین 8 بیتی رو به 16 بیت انتقال بدین که در کد زیر درستش رو نوشتم
این حالت برای مقایسه اولین و آخرین هست


org 100h

mov bh,0
mov bl,len
dec bl
mov cl,[buf+bx]
cmp cl,buf
je Label_1


Label_1:

ret

buf db "MARYAM"
len db 6
end

موفق باشید

M.amin
سه شنبه 06 دی 1390, 22:54 عصر
تشکر فراوان از دوستان عزیز من برنامه رو با اصلاحات شما دوستان دوباره نوشتم و برنامه به درستی کار میکند .
اما یه سوال از جناب xman_1365_x (http://barnamenevis.org/member.php?33193-xman_1365_x)
چرا buf+bx کردیم ؟ مگه مقدار bx چند هستش
و برای چی dec BL ؟
باز هم از دوستان کمال تشکر رو دارم

xman_1365_x
سه شنبه 06 دی 1390, 23:02 عصر
کمی بعد از من پست دادین انگار جواب رو ندیدین:لبخندساده:


.model small
.stack
.data
msg1 DB 13,10,"Matn Mored Nazar Ra Vared Konid : :",13,10,"$"
msg2 DB 13,10,"Charakter Aval Ba Akhar Mosavi Hastand ",13,10,"$"
msg3 DB 13,10,"Charakter Aval Ba Akhar Mosavi Nistand ",13,10,"$"
string LABEL BYTE
max DB 20
len DB ?
buf DB 20 dup(?)
.code
main proc far

mov ax ,@data
mov ds,ax

lea dx,msg1
mov ah,09h
int 21h

lea dx,string
mov ah,0ah
int 21h

xor bx,bx
mov bl,len
dec bl

mov cl,[buf+bx]
cmp cl,buf
je Label_1
lea dx,msg3
mov ah,09h
int 21h
jmp exit

Label_1: lea dx,msg2
mov ah,09h
int 21h


exit:

mov ah,4ch
int 21h
main endp
end main

pe32_64
چهارشنبه 07 دی 1390, 00:36 صبح
جناب xman_1365_x (http://barnamenevis.org/member.php?33193-xman_1365_x)
اون دوتا تکه کدی که گذاشتم و فرمودین غلطه، از نظر MACRO ASSEMBLER اشتباهه ،ولی از نظر FASM درسته و خودم تستش کردم(با EMU)
من کد M.amin (http://barnamenevis.org/member.php?79387-M.amin) رو چک نکردم ولی کد زیر نسخه ی MACRO ASSEMBLER اون دوتا کد خودم که بالا گذاشتم:


buf db "MARYAM"
len db 6

lea si,buf
lea di,buf
add di,offset len-1
mov al,[di]
cmp [si],al
je EXIT

که مثل کدهای قبلی کار می کنندو ممنون از اینکه اینقدر توجه دارید و وقت می گذارین

xman_1365_x
چهارشنبه 07 دی 1390, 03:45 صبح
دوستان سعی کنید با یک نام کاربری وارد شین:چشمک:

چرا buf+bx کردیم ؟ مگه مقدار bx چند هستش
و برای چی dec BL ؟

مقدار bx =len-1=6-1 یک واحدی که کم میشه برای اینه عنصر اول همون آدرس بافر هست برای همین یک واحد کم میکنیم طول بافر رو
دستور dec برای کم کردن یک واحد هست همون منهی یک که داریم
برنامه رو در امولاتور خط به خط اجرا کنید تغییرات رو مشاهده کنید!

xman_1365_x
چهارشنبه 07 دی 1390, 03:51 صبح
جناب xman_1365_x (http://barnamenevis.org/member.php?33193-xman_1365_x)
اون دوتا تکه کدی که گذاشتم و فرمودین غلطه، از نظر MACRO ASSEMBLER اشتباهه ،ولی از نظر FASM درسته و خودم تستش کردم(با EMU)
من کد M.amin (http://barnamenevis.org/member.php?79387-M.amin) رو چک نکردم ولی کد زیر نسخه ی MACRO ASSEMBLER اون دوتا کد خودم که بالا گذاشتم:


buf db "MARYAM"
len db 6

lea si,buf
lea di,buf
add di,offset len-1
mov al,[di]
cmp [si],al
je EXIT

که مثل کدهای قبلی کار می کنندو ممنون از اینکه اینقدر توجه دارید و وقت می گذارین
بله بازم میگم اشتباه هست مثل همین کدی که گذاشتین، چرا ؟
کد شما مشکلش اینه آدرس len رو با آدرس buf جمع میکنید و به آدرس اشتباه میرین و برنامه اشتباه میشه خروجیش! کد های قبلی هم خودتون تست کنید مشکلتون رو متوجه میشین
کد شمارو درست کردم تغییرات رو بررسی کنید

org 100h

dec len
lea si,buf
lea bx,buf
add bl,len
mov al,[bx]
cmp [si],al
je EXIT
cld
EXIT:
stc

ret
buf db "MARYAM"
len db 6
end

M.amin
چهارشنبه 07 دی 1390, 10:47 صبح
برنامه رو در امولاتور خط به خط اجرا کنید تغییرات رو مشاهده کنید!

بله ، من دقیقا متوجه شدم .
اما حالا اگه اگه بخواهیم یه کم برنامه رو تغییر بدیم . اگه بخواهیم رشته ای رو که داریم رو از آخر به اول چک کنیم که آیا با رشته وارد شده مساوی است یا خیر . ( مثلا ABA رو از هر طرف چک کنیم مساوی هستند )
به نظرتون باید چه کار بکنیم ؟

pe32_64
چهارشنبه 07 دی 1390, 13:33 عصر
جناب xman_1365_x (http://barnamenevis.org/member.php?33193-xman_1365_x)این کد درسته؟(اشتباهشو درست فهمیدم)



STACK SEGMENT PARA STACK 'Stack'
DB 1024 DUP(0)
STACK ENDS
DATASEG SEGMENT PARA 'data'
buf1 db "ASM"
buf db "MARYAM"
buf2 db "peyman"
len1 db 8
len db 6
len2 db 56
DATASEG ENDS
CODESEG SEGMENT PARA 'Code'
MAIN PROC FAR
ASSUME SS:STACK,DS:DATASEG,CS:CODESEG
MOV AX,DATASEG
MOV DS,AX
MOV ES,AX
s:
lea si,buf
lea di,buf
mov bl,len
dec bl
cbw
add di,bx
mov al,[di]
cmp [si],al
je EXIT
jmp s
EXIT:
MOV AX,4C00H
INT 21H
MAIN ENDP
CODESEG ENDS
END MAIN

xman_1365_x
چهارشنبه 07 دی 1390, 23:04 عصر
این کد درسته؟(اشتباهشو درست فهمیدم)
با در نظر نگرفتن دستور cbw که اضافه هست و دستور jmp s باعث میشه برنامه توی حلقه بینهایت گیر کنه اگر کاراکتر برابر نباشه ، باقیش همون روش هست که نمونه کد گذاشتم و درسته
البته bh=0 نکردین در این برنامه اشکالی نداره اما در برنامه های دیگه باید حواستون باشه باعث میشه اشتباه میشه
موفق باشی

pe32_64
پنج شنبه 08 دی 1390, 17:58 عصر
مطابق دستورتون برنامه تصحیح شد:


STACK SEGMENT PARA STACK 'Stack'
DB 1024 DUP(0)
STACK ENDS
DATASEG SEGMENT PARA 'data'
buf1 db "ASM"
buf db "MARYAM"
buf2 db "peyman"
len1 db 8
len db 6
len2 db 56
DATASEG ENDS
CODESEG SEGMENT PARA 'Code'
MAIN PROC FAR
ASSUME SS:STACK,DS:DATASEG,CS:CODESEG
MOV AX,DATASEG
MOV DS,AX
MOV ES,AX
lea si,buf
lea di,buf
xor bx,bx
mov bl,len
dec bl
add di,bx
mov al,[di]
cmp [si],al
je EXIT
jmp Next
Next:
mov ah, 1
int 21h
EXIT:
MOV AX,4C00H
INT 21H
MAIN ENDP
CODESEG ENDS
END MAIN

M.amin
جمعه 09 دی 1390, 22:23 عصر
در مورد چک کردن رشته از آخر به اول دوستان میشه راهنمایی کنن .
میتونیم رشته رو معکوس کنیم . و بعد اون رو با buf مقایسه کنیم .؟

xman_1365_x
شنبه 10 دی 1390, 18:51 عصر
در مورد چک کردن رشته از آخر به اول دوستان میشه راهنمایی کنن .
میتونیم رشته رو معکوس کنیم . و بعد اون رو با buf مقایسه کنیم .؟
نیازی به معکوس کردن نیست با یک واحد کم کردن از آدرس انتهای رشته به سمت اول رشته پیمایش میکنید
کاقیه دستوری که به انتهای رشته میرفتیم بعد از مقایسه dec کنید
موفق باشی

M.amin
شنبه 10 دی 1390, 22:58 عصر
نیازی به معکوس کردن نیست با یک واحد کم کردن از آدرس انتهای رشته به سمت اول رشته پیمایش میکنید
کاقیه دستوری که به انتهای رشته میرفتیم بعد از مقایسه dec کنید
موفق باشی
سوال این هستش چک بشه که رشته ورودی وقتی از انتها پیمایش میشه مساوی هست با پیمایش از ابتدا .
مثلا رشته " ABCBA" این رشته از هر دو طرف وقتی پیمایش میشه مساوی هستش .
تو کد قبلی ما انتهای رشته رو با ابتدای رشته مقایسه می کردیم . با کم کردن آدرس انتهای رشته ، فقط از انتها به ابتدا با کاراکتر اول رشته چک میشه .

xman_1365_x
یک شنبه 11 دی 1390, 17:52 عصر
سوال این هستش چک بشه که رشته ورودی وقتی از انتها پیمایش میشه مساوی هست با پیمایش از ابتدا .
مثلا رشته " ABCBA" این رشته از هر دو طرف وقتی پیمایش میشه مساوی هستش .
تو کد قبلی ما انتهای رشته رو با ابتدای رشته مقایسه می کردیم . با کم کردن آدرس انتهای رشته ، فقط از انتها به ابتدا با کاراکتر اول رشته چک میشه .

این برنامه نیاز به حلقه داره درون حلقه یکی به ابتدا اشاره کنه و یکی به انتهای رشته بعد مقایسه کنید و در هر مرحله از انتها یک واحد کم بشه و به ابتدای آدرس یک واحد اضافه بشه

M.amin
پنج شنبه 15 دی 1390, 15:43 عصر
من این رو نوشتم اما خطا میگیره

Mohasebe proc neare


mov bh,0
mov bl,len
for: cmp dx,bx
je exit

dec bl
mov cl,[buf+bx]
cmp cl,[buf+dx]
jne label_1
inc dx
jmp for
ret

xman_1365_x
جمعه 16 دی 1390, 17:25 عصر
من این رو نوشتم اما خطا میگیره
خوب اشتباه نوشتین!
از dx به عنوان اندیس استفاده کردی:لبخندساده:،اندیس ابتدا باید صفر باشه،حلقه باید len/2 باشه
موفق باشی