View Full Version : سوال: مقایسه اولین کاراکتر یک رشته با آخرین کاراکتر همان رشته
  
M.amin
یک شنبه 04 دی 1390, 16:32 عصر
یه رشته ای رو از کاربر دریافت کردیم و میخواهیم که اولین کاراکتر رو با آخرین کاراکتر در رشته رو مقایسه کنه و اگه مثل هم بودند با یه پیغام اعلام کنه .
مشکلی که من دارم مقایسه کردن اولین کاراکتر با آخرین کاراکتر هستش .
دوستان می تونند راهنمایی کنند ؟
M.amin
دوشنبه 05 دی 1390, 18:12 عصر
دوستان کسی راه حلی به ذهن اش نمیرسه .
اگه اولین عنصر Buffer رو درون یک ثبات بریزیم و بعد اگه بخواهیم با اندیس دادن به Buffer  آخرین عنصر رو با ثبات مقایسه کنیم . به نظرتون عملی هست !
xman_1365_x
دوشنبه 05 دی 1390, 18:45 عصر
فقط کافیه یک اشاره گر به ابتدا بافر و دیگری به انتهای بافر اشاره کنه بعد مقایسه کنید
برای این کار یک ثبات مشترک برای نگهداری آدرس شروع و برای رفتن به انتها هم طول بافر رو در ثبات bx قرار بدین و مقایسه  کنید ، همین
موفق باشی
M.amin
سه شنبه 06 دی 1390, 13:15 عصر
من به این شکل نوشتم ولی کار نمیکنه 
mov cl,buf[bx]
         mov bx,0
         mov bl,buf[bx]
         cmp cl,bl
         je Label_1
pe32_64
سه شنبه 06 دی 1390, 17: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, 20:02 عصر
من برنامه تون رو تصحیح کردم:
فقط این خط سوم رو هم باید اصلاح کنید
    xor bx,bx
    mov bl,len-1
و نیازی به خط پنجم نیست و در خط ششم هم به bx فقط کاربردی که میتونه داشته باشه بخواین عناصر دیگه ای هم بررسی کنید که برای کم کردن دستورات باید از si,di کمک بگیرین
pe32_64
سه شنبه 06 دی 1390, 21: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, 23: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, 23:54 عصر
تشکر فراوان از دوستان عزیز  من برنامه رو با اصلاحات شما دوستان دوباره نوشتم و برنامه به درستی کار میکند .
اما یه  سوال از جناب xman_1365_x (http://barnamenevis.org/member.php?33193-xman_1365_x)  
چرا buf+bx کردیم ؟ مگه مقدار bx  چند هستش 
و برای چی dec BL ؟
باز هم از دوستان کمال تشکر رو دارم
xman_1365_x
چهارشنبه 07 دی 1390, 00: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, 01: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, 04:45 صبح
دوستان سعی کنید با یک نام کاربری وارد شین:چشمک:
چرا buf+bx کردیم ؟ مگه مقدار bx چند هستش 
و برای چی dec BL ؟
مقدار bx =len-1=6-1 یک واحدی که کم میشه برای اینه عنصر اول همون آدرس بافر هست برای همین یک واحد کم میکنیم طول بافر رو
دستور dec برای کم کردن یک واحد هست همون منهی یک که داریم
برنامه رو در امولاتور خط به خط اجرا کنید تغییرات رو مشاهده کنید!
xman_1365_x
چهارشنبه 07 دی 1390, 04: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, 11:47 صبح
برنامه رو در امولاتور خط به خط اجرا کنید تغییرات رو مشاهده کنید!
 
بله ، من دقیقا متوجه شدم . 
اما حالا اگه اگه بخواهیم یه کم برنامه رو تغییر بدیم . اگه بخواهیم رشته ای رو که داریم رو از آخر به اول چک کنیم که آیا با رشته وارد شده مساوی است یا خیر . ( مثلا ABA  رو از هر طرف چک کنیم مساوی هستند )
به نظرتون باید چه کار بکنیم ؟
pe32_64
چهارشنبه 07 دی 1390, 14: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
پنج شنبه 08 دی 1390, 00:04 صبح
این کد درسته؟(اشتباهشو درست فهمیدم)
با در نظر نگرفتن دستور cbw که اضافه هست و دستور jmp s باعث میشه برنامه توی حلقه بینهایت گیر کنه اگر کاراکتر برابر نباشه ، باقیش همون روش هست که نمونه کد گذاشتم و درسته
البته bh=0 نکردین در این برنامه اشکالی نداره اما در برنامه های دیگه باید حواستون باشه باعث میشه اشتباه  میشه
موفق باشی
pe32_64
پنج شنبه 08 دی 1390, 18: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, 23:23 عصر
در مورد چک کردن رشته از آخر به اول دوستان میشه راهنمایی کنن . 
میتونیم رشته رو معکوس کنیم . و بعد اون رو با buf  مقایسه کنیم .؟
xman_1365_x
شنبه 10 دی 1390, 19:51 عصر
در مورد چک کردن رشته از آخر به اول دوستان میشه راهنمایی کنن . 
میتونیم رشته رو معکوس کنیم . و بعد اون رو با buf  مقایسه کنیم .؟
نیازی به معکوس کردن نیست با یک واحد کم کردن از آدرس انتهای رشته به سمت اول رشته پیمایش میکنید
کاقیه دستوری که به انتهای رشته میرفتیم بعد از مقایسه dec کنید
موفق باشی
M.amin
شنبه 10 دی 1390, 23:58 عصر
نیازی به معکوس کردن نیست با یک واحد کم کردن از آدرس انتهای رشته به سمت اول رشته پیمایش میکنید
کاقیه دستوری که به انتهای رشته میرفتیم بعد از مقایسه dec کنید
موفق باشی
سوال این هستش چک بشه که  رشته ورودی وقتی از انتها پیمایش میشه مساوی هست با پیمایش از ابتدا . 
مثلا رشته " ABCBA" این رشته از هر دو طرف وقتی پیمایش میشه مساوی هستش .
تو کد قبلی ما انتهای رشته رو با ابتدای رشته مقایسه می کردیم . با کم  کردن آدرس انتهای رشته ، فقط از انتها به ابتدا با کاراکتر اول رشته چک میشه .
xman_1365_x
یک شنبه 11 دی 1390, 18:52 عصر
سوال این هستش چک بشه که  رشته ورودی وقتی از انتها پیمایش میشه مساوی هست با پیمایش از ابتدا . 
مثلا رشته " ABCBA" این رشته از هر دو طرف وقتی پیمایش میشه مساوی هستش .
تو کد قبلی ما انتهای رشته رو با ابتدای رشته مقایسه می کردیم . با کم  کردن آدرس انتهای رشته ، فقط از انتها به ابتدا با کاراکتر اول رشته چک میشه .
 
این برنامه نیاز به حلقه داره درون حلقه یکی به ابتدا اشاره کنه و یکی به انتهای رشته بعد مقایسه کنید و در هر مرحله از انتها یک واحد کم بشه و به ابتدای آدرس یک واحد اضافه بشه
M.amin
پنج شنبه 15 دی 1390, 16: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, 18:25 عصر
من این رو نوشتم اما خطا میگیره 
خوب اشتباه نوشتین!
از dx به عنوان اندیس استفاده کردی:لبخندساده:،اندیس ابتدا باید صفر باشه،حلقه باید len/2 باشه
موفق باشی
 
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.