PDA

View Full Version : سوال: راهنمائی برای کپی دو استرینگ در همدیگه



#Elahe#
سه شنبه 16 آبان 1391, 06:29 صبح
سلام
من میخوام محتوای دو تا استرینگ رو باهمدیگه عوض کنم
به طوری که هر دو محتوا قابل چاپ تو خروجی باشه
یعنی اینطور نباشه که یکیش رو کپی کنیم تو اون یکی و در نتیجه محتوای یکیش از بین بره !

من برای عکس کردن یه استرینگ کدش رو نوشتم
میخواستم با تغییر تو همین کد برنامه مورد نظرم (کپی محتوای دو استرینگ در همدیگه) رو هم بنویسم
ولی از آنجائی که هم مبتدی هستم و هم در کار با ثباتهای اشاره گر گیج شدم نمیتونم با این الگوریتم برنامه رو بنویسم :لبخند:


page 100,100
title revers string
.data
string db 'assembly','$'
stringlength dw 08
stringrevers db 08 dup(?)
.code
main proc far
mov ax, @data
mov ds, ax
mov es, ax
mov cx, stringlength
lea si, string
lea di, stringrevers
add si, stringlength
unknown!:
add si, -1
L1:
mov al, [si]
mov [di], al
dec si
inc di
loop L1
mov al, [si]
mov [di], al
inc di
mov dl, '$'
mov [di], dl

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

mov ax, 4c00h
int 21h
main endp
end main


اگر الگوریتم دیگه ای هم واسه این برنامه هست بفرمائید
مثل استفاده از xchg

xman_1365_x
سه شنبه 16 آبان 1391, 08:57 صبح
من میخوام محتوای دو تا استرینگ رو باهمدیگه عوض کنم
به طوری که هر دو محتوا قابل چاپ تو خروجی باشه
یعنی اینطور نباشه که یکیش رو کپی کنیم تو اون یکی و در نتیجه محتوای یکیش از بین بره !

شما یک دو بافر دارید که دو رشته در آنها هست،حالا برای الحاق دو رشته باید طول حافظه ای که به رشته دوم تخصیص میدین به اندازه مجموع دو رشته باشه
حالا تنها کاری که باید انجام بدین اینه ، طول رشته رو بدست بیارین و از اون ایندکس شروع به کپی رشته دوم کنید دقیقا از دالر رشته دوم شروع به جایگزینی کنید و تا دالر رشته اول در رشته دوم کپی کنید.

بدست آوردن طول رشته: در رشته دوم پیمایش کنید تا به دالر که انتهای رشته رو مشخص میکنه برسید یا با کم کردن آدرس انتها از ابتدا منهی طول رشته دوم،برای انتقال هم از دستور mov و یک حلقه استفاده کنید.
شروع به نوشتن کنید تا بیشتر راهنمایی کنم،موفق باشی.

#Elahe#
چهارشنبه 17 آبان 1391, 14:16 عصر
اینطوری که مقداری حافظه هرز میمونه رو دستمون :دی
نمیشه کاراکترهای متناظر باهم رو باهمدیگه عوض کرد ؟
کاراکتر اول استرینگ 1 با کاراکتر اول استرینگ 2
کاراکتر دوم استرینگ 1 با کاراکتر دوم استرینگ 2
کاراکتر سوم استرینگ 1 با کاراکتر سوم استرینگ 2
...

Finisher
پنج شنبه 18 آبان 1391, 07:34 صبح
سلام

شاید این کمک بکنه ...

page 100,100
title swap string

CR EQU 0DH
LF EQU 10

.model small

.data
string db 'assembly',cr,lf,'$'
stringlength dw 08
stringrevers db 'abcdefgh' , '$'

.code
main proc far
mov ax, @data
mov ds, ax

mov cx, stringlength
lea si, string
lea di, stringrevers

L1:
mov al, [si]
mov ah, [di]
xchg [si], ah
xchg [di], al
inc si
inc di
loop L1

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

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

mov ax, 4c00h
int 21h
main endp
end main

#Elahe#
پنج شنبه 18 آبان 1391, 17:58 عصر
سلام

شاید این کمک بکنه ...

page 100,100
title swap string

CR EQU 0DH
LF EQU 10

.model small

.data
string db 'assembly',cr,lf,'$'
stringlength dw 08
stringrevers db 'abcdefgh' , '$'

.code
main proc far
mov ax, @data
mov ds, ax

mov cx, stringlength
lea si, string
lea di, stringrevers

L1:
mov al, [si]
mov ah, [di]
xchg [si], ah
xchg [di], al
inc si
inc di
loop L1

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

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

mov ax, 4c00h
int 21h
main endp
end main

با تشکر از شما
من هم اینجوری نوشته بودم
ولی تو خط 25 به جای ah نوشته بودم bl
و برنامه ارور میداد
یعنی ارور واسه همین بوده ؟

یکی دو تا سوال هم دارم
تو خط 10 اون cr و lf واسه چیه ؟ کارشون چیه؟
تو خط 11 چرا طول استرینگ رو 88 گرفتین ؟ اینطوری لوپ 60-70 تا اضافی چک نمیکنه ؟

Finisher
جمعه 19 آبان 1391, 15:38 عصر
سلام

توی خط 4 و 5 , CR و LF رو مقدار دهی کردم با دستور EQU که مثل دستور define# توی زبان C هست .
حالا این ها مثل n\ توی زبان C عمل می کنند (درواقع مقدارشون 13 و 10 هست) .
بعد هر جا لازم شد می شه ازشون استفاده کرد برای اینکه به خط جدید بریم ...

مقدار string رو 8 گرفتم ... !