PDA

View Full Version : تابع strcat



kiuhnmgtrdcv
پنج شنبه 21 خرداد 1388, 20:17 عصر
تابع strcat در c برای الحاق 2 رشته بکار میرفت
چطور این تابع در اسمبلی میشه درست کرد ؟

tdkhakpur
پنج شنبه 21 خرداد 1388, 21:43 عصر
سلام ماکرووی زیر رو در نظر بگیرید


strcat macro str1, str2
jmp start
len dw -1
start:
mov bp, 0
label1:
add len, 1
cmp byte ptr str1[bp], 0
inc bp
jne label1
mov bp, 0
mov bx, len
label2:
mov byte ptr str1[bx], byte ptr str2[bp]
cmp byte ptr str1[bp], 0
inc bp
inc bx
jne label2
endm

کد ها دستی نوشته شد ایرادی داشت اصلاح کنید ولی الگوریتم کلی همینه.
و یک چیز دیگر این هست که طول str1باید ظرفیت اضافه شدن str2رو به انتهاش را داشته باشد.
و نکته دیگر این هست که آخر رشته ها به 0 ختم بشود
موفق باشید.

kiuhnmgtrdcv
جمعه 22 خرداد 1388, 01:43 صبح
مرسی من ماکرو بالا رو با این کد اجرا کردم و این خطا گرفتم

(30) wrong parameters: MOV byte ptr str1[bx], byte ptr s2[bp]

strcat macro str1, str2
jmp start
len dw -1
start:
mov bp, 0
label1:
add len, 1
cmp byte ptr str1[bp], 0
inc bp
jne label1
mov bp, 0
mov bx, len
label2:
mov byte ptr str1[bx], byte ptr str2[bp]
cmp byte ptr str1[bp], 0
inc bp
inc bx
jne label2
endm

.model small
.stack 64h
.data
s1 db "str1 $"
s2 db "str2$"
;str3
.code
main proc far

strcat s1,s2
lea dx,str1
mov ah,9h
int 21h

main endp

end main

tdkhakpur
جمعه 22 خرداد 1388, 12:40 عصر
سلام


strcat macro str1, str2
jmp start
len dw -1
start:
lea bp, str1
label1:
add len, 1
cmp byte ptr [bp],'$'
inc bp
jne label1
lea bx, str2
label2:
mov dl, byte ptr [bx]
mov byte ptr [bp], dl
cmp dl, '$'
inc bp
inc bx
jne label2
endm

.model small
.stack 64h
.data
s1 db "str1$ ";فضای اضافی برای جای گرفتن رشته پایینی
s2 db "str2$"
;str3
.code
main proc far

strcat s1,s2
lea dx,str1
mov ah,9h
int 21h

main endp

end main

موفق باشید.

kiuhnmgtrdcv
جمعه 22 خرداد 1388, 19:43 عصر
من این کد اجرا کردم با emu8086 مثل اینکه تو دور بینهایت افتاده توی این عکس خط 35 تا 39
http://i41.tinypic.com/28ms9f.gif
http://i41.tinypic.com/28ms9f.gif
اینم سورسش


.model small
.stack 64h
.data
s1 db "str1 $"
s2 db "str2$"

.code
main proc far

;strcat s1,s2
jmp start
len dw -1
start:
lea bp, s1
label1:
add len, 1
cmp byte ptr [bp],'$'
inc bp
jne label1
lea bx, s2
label2:
mov dl, byte ptr [bx] ;bx reshte 2
mov byte ptr [bp], dl ;bp reshte 1
cmp dl, '$'
inc bp
inc bx
jne label2
;print s1+s2
lea dx,s1
mov ah,9h
int 21h

main endp

end main

tdkhakpur
شنبه 23 خرداد 1388, 11:58 صبح
سلام


.model small
.stack 64h
.data
s1 db "str1$ "; اصلاح
s2 db "str2$"
len dw -1 ; انتفال

.code
main proc far
lea bp, s1
label1:
add len, 1
cmp byte ptr [bp],'$'
inc bp
jne label1
lea bx, s2
dec bp
label2:
mov dl, byte ptr [bx] ;bx reshte 2
mov byte ptr [bp], dl ;bp reshte 1
cmp dl, '$'
inc bp
inc bx
jne label2
;print s1+s2
lea dx,s1
mov ah,9h
int 21h

main endp

end main

موفق باشید.

kiuhnmgtrdcv
شنبه 23 خرداد 1388, 13:42 عصر
ممنون
مشکل اینجاست که تو خط 13 هیچوقت مقدار bp با "$" یکی نمیشه و حلقه label1 هم بینهایت دفعه تکرار میشه(خط 12 تا 15
با همون کد بالایی که گذاشتید
http://f.imagehost.org/0916/infiT.gif
http://f.imagehost.org/0916/infiT.gif

tdkhakpur
شنبه 23 خرداد 1388, 13:46 عصر
سلام
ویرایش شد.

tdkhakpur
شنبه 23 خرداد 1388, 14:04 عصر
سلام
مشکل از فلاگ علامت بود.
به هر حال سورس کلی این هست


.model small
.stack 64h
.data
s1 db "str1$ "; اصلاح
s2 db "str2$"
.code
main proc far
lea bp, s1
label1:
mov dl, byte ptr [bp]
inc bp
cmp dl,'$'
jne label1
lea bx, s2
dec bp
label2:
mov dl, byte ptr [bx] ;bx reshte 2
mov byte ptr [bp], dl ;bp reshte 1
inc bp
inc bx
cmp dl, '$'
jne label2
;print s1+s2
lea dx,s1
mov ah,9h
int 21h
main endp
end main

موفق باشید.

kiuhnmgtrdcv
دوشنبه 25 خرداد 1388, 14:38 عصر
کد بالایی الگوریتم خوبی داره ولی من نفهمیدم چرا تو label2 تو دور بینهایت گیر میکنه
من اینجا از عملگر movsb برای الحاق دو رشته استفاده کردم(فرض کردم طول رشته ای که میخواهد وارد بشه 5 است ) الان با این کد دو رشته به هم متصل میشه


.model small
.stack 128
.data
m1 db "enter a str$"
m2 db 10,13,"str is: $"
m3 db 10,13,"$"
strlist label byte
max db 80
len dw ?
buf db 80 dup('$')
str2 db "str2$"
.code
main proc far
mov ax,@data
mov ds,ax
mov ax,ds
mov es,ax
;**
mov ah,0ah
lea dx,strlist
int 21h
;**
lea si,str2

lea bp,buf
add bp,5
mov di,bp


cld
mov cx,80
rep movsb


mov ah,9
lea dx,buf
int 21h

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

tdkhakpur
دوشنبه 25 خرداد 1388, 17:01 عصر
من اینجا از عملگر movsb برای الحاق دو رشته استفاده کردم(فرض کردم طول رشته ای که میخواهد وارد بشه 5 است ) الان با این کد دو رشته به هم متصل میشه


cld
mov cx,80
rep movsb

ولی cxرا برای چی 80 کردید.

kiuhnmgtrdcv
دوشنبه 25 خرداد 1388, 19:59 عصر
منظور خاصی نداشتم
تو نوشتن این کد زیاد دقت نکردم فقط خواستم بگم از این روش هم میشه کمک گرفت

tdkhakpur
سه شنبه 26 خرداد 1388, 00:53 صبح
سلام
خوب کار های شما را راحت میکند.

kiuhnmgtrdcv
شنبه 30 خرداد 1388, 20:56 عصر
فهمدیم چرا کدی که شما نوشته بوذی تو دور بینهایت گیر کرده بود
چون کاراکتر اخر یه رشته 0dh یا همون enter هست و برای اینکه به کاراکتر واقعی برسیم باید طول رشته با ادرس بافر رشته جمع کنیم که اینتر میده و باید ازش عدد یک کم کنیم تا به اخرین کاراکتر برسیم