ورود

View Full Version : معکوس رشته در اسمبلی



mojtaba_kz
یک شنبه 11 تیر 1391, 12:58 عصر
سلام علیکم دوستان
در مورد برنامه ای که یک رشته 100 تایی را معکوس کند. توضیح دهید

چه راه حلی مد نظر شما هست

اگر نمونهای دارید ذکر بفرمایید

به این شکل که :
ورودی

My name Is ali


>>> در خروجی

ali is name my
دقت کنید که حروف کلمات نباید معکوس شود فقط جای کلمات تغییر میکند

این رو میدونم که باید al رو مقایسه کنم با اسپیس مابین کلمات ولی مشکل من اینه که حروف هم تغییر می کند

MostafaMohammadi
یک شنبه 11 تیر 1391, 19:01 عصر
اینکه یه رشته از کاربر بگیری و ذخیره کنی رو که بلدی؟
حالا فرض کن این رشته رو تو حافظه داریم، به این صورت است:

STR1 DB "my name is Ali"
شروع کن به خوندن اش از آخرین حرف و ریختن اون حرف‌ها داخل استک، تا برسی به کاراکتر اسپیس. وقتی رسیدی به اسپیس به تعداد کاراکترهایی که ریختی تو استک، از تو استک بخون و چاپ کن. بعد برو سراغ ادامه رشته.
یعنی یه ثبات رو به عنوان شمارشگر انتخاب کن، پیشنهاد می کنم CX رو انتخاب کنی، بعد آخرین خونه رشته رو بخون، با کاراکتر اسپیس مقایسه اش کن، اگه نبود ذخیره اش کن تو استک و شمارشگرات رو یه دونه افزایش بده، برو سراغ کاراکتر بعد. اون قدر اینکار رو بکن تا برسی به یه اسپیس، وقتی رسیدی به اسپیس به تعداد CX بار از استک بخون و چاپ کن. بعد برو سرواغ خونه بعدی رشته و ...
فقط حواس ات باشه کل این عملیات باید به اندازه طول رشته ات انجام بشه، برای همین بهتره از بافر برای گرفتن رشته ات استفاده کنی تا اندازه اش دست ات باشه.

mojtaba_kz
دوشنبه 12 تیر 1391, 01:01 صبح
سلام علیکم

آقا محمد تشکر ازاینکه پاسخ دادید.

کد زیر کدی هست که تا به حا نوشتم یه لطفی کنید ببینید مشکل از کجاست؟؟؟

یه سوال دیگر اصلا می شود در یک برنامه چند بار آدرس منبع و مقصد رو (SI,DI) را مقدار دهی کرد؟؟؟ من جایی از برنامه در لیبل 3 و چهار این کار رو کردم آیا مشکلی هست از این جهت؟؟؟؟

مشکلات من:

1-پس از خواندن اولین کاراکتر از سمت چپ و برگشتن به لیبل 1 و خواندن کاراکتر دوم و درج آن در temp ، کاراکتر دوم بر روی کاراکتر اول قرار می گیرد. (راه حل چیست؟)

2- عمل نکردن Std در هیچ کدوم از برنامه ها حتی برنامه های کوچک...



; multi-segment executable file template.
data segment


path db 'c:\source.txt'


buffer db 100 dup(?)

handle dw ?
str db 100 dup(?)
temp db 100 dup(?)

c db 0


ends
stack segment
dw 128 dup(0)
ends
code segment
start:
; set segment registers:
mov ax, data
mov ds, ax
mov es, ax




mov al,0 ;if al=0 >>>>> only Read
lea dx,path

mov ah, 3dh ;open existing file.
int 21h

mov handle, ax
mov bx, handle

mov cx, 99
lea dx,buffer

mov ah,3fh ;read from file
int 21h

;***************************in qesmat be paeen Moshkel Daram

;lea di,temp[0]
lea si,buffer[0]
l1:
cld
lodsb
cmp al,032
ja l2 ;ja : al > ' '
jc l2 ;jc : al < ' '

jmp l3 ;j


l2:
cmp al, 000 ; Null ascii code
ja l3
jmp Lend


l3:
lea di,temp
stosb
inc c


jmp l1


l4:

lodsb

stosb ; add space to temp

jmp l5

l5:
mov di,c
std
lea si,temp[di] ;cut to end str Right to Left
lea di,str[100]

mov cx, c ; c Tooleh kalameh ro dar khod darad

rep movsb

ja l6 ; al > ' '

L6:
;This label For Reset Temp & C

mov c,0 ;reset Counter


cld ;df=0

mov al,000 ;Null ascii Code
lea di,temp[0]

mov cx,100
rep stosb


jmp l1


Lend:


mov ax, 4c00h ; exit to operating system.
int 21h
ends
end start ; set entry point and stop the assembler.

ssbostan
دوشنبه 12 تیر 1391, 19:31 عصر
با سلام؛
براي دريافت رشته از وقفه 21h استفاده كنيد و سپس يك رشته جديد به طول رشته دريافتي ايجاد كنيد.
با كمك دستور lodsb مقادير رشته اول رو به al منتقل كنيد و با space مقايسه كنيد و در صورتي كه برابر نبود ax رو در پشته ذخيره كرده و اين كار رو تا زماني كه به space نرسيديد تكرار كنيد.
با كمك دستور stosb مقادير رو -از پشته خارج كرده و- در رشته جديد ذخيره كنيد.
اين دو مرحله رو به تعداد طول رشته دريافتي بايد تكرار كنيد.
در نهايت رشته جديد رو با وقفه 21h روي صفحه چاپ كنيد.

كد رو بنويسيد، اگر مشكلي بود جواب ميدم.
موفق باشيد.

mojtaba_kz
دوشنبه 12 تیر 1391, 23:04 عصر
با سلام؛
براي دريافت رشته از وقفه 21h استفاده كنيد و سپس يك رشته جديد به طول رشته دريافتي ايجاد كنيد.
با كمك دستور lodsb مقادير رشته اول رو به al منتقل كنيد و با space مقايسه كنيد و در صورتي كه برابر نبود ax رو در پشته ذخيره كرده و اين كار رو تا زماني كه به space نرسيديد تكرار كنيد.
با كمك دستور stosb مقادير رو -از پشته خارج كرده و- در رشته جديد ذخيره كنيد.
اين دو مرحله رو به تعداد طول رشته دريافتي بايد تكرار كنيد.
در نهايت رشته جديد رو با وقفه 21h روي صفحه چاپ كنيد.

كد رو بنويسيد، اگر مشكلي بود جواب ميدم.
موفق باشيد.

علیکم السلام

آقا مشکل حل شد تا قسمتی

ولی این مشکل هنوز حل نشده

1-پس از خواندن اولین کاراکتر از سمت چپ و برگشتن به لیبل 1 و خواندن کاراکتر دوم و درج آن در temp ، کاراکتر دوم بر روی کاراکتر اول قرار می گیرد. (راه حل چیست؟)

یعنی بجای اینکه ادامه کارکتر قبلی چاپ کنه روی همون کارکتر قبلی قرار می گیره.

ssbostan
سه شنبه 13 تیر 1391, 08:35 صبح
با سلام؛
متغير temp اي كه تعريف كرديد چند بايت هست؟؟
اگر اطلاعات رو در پشته ذخيره كنيد، نياز به تعريف متغير temp هم نداريد.

موفق باشيد.

ssbostan
جمعه 23 تیر 1391, 00:55 صبح
با سلام؛
از كد زير ميتونيد به عنوان نمونه استفاده كنيد.



mov ax, 0
mov bx, 0
mov bl, [slen]
mov cx, 0
lea si, str1
lea di, str2

mov al, [slen]
add si, ax
dec si

mov ax, 0


split_words:

cmp bx, 0
je mk_reverse
dec bx
std
lodsb
cmp al, ' '
je mk_reverse
inc cx
push ax

jmp split_words


mk_reverse:

cld
cmp cx, 0
je mk_space
pop ax
stosb
dec cx

jmp mk_reverse

mk_space:

cmp bx, 0
je mk_print

mov [di], ' '
inc di

jmp split_words

mk_print:

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


exit:

mov ah, 4ch
mov al, 00h
int 21h



str1 db "my name is ssbostan"
slen db $-str1
str2 db slen dup('$'), 24h


موفق باشيد.

navidgh
دوشنبه 27 آبان 1392, 16:33 عصر
سلام
برنامه ای که در 8086 باشه
یک رشته 100 بایتی از ورودی بخواند و معکوس آن را در مکان دیگری از حافظه قرار دهد به کمک دستورات رشته ای
ورودیabc
خروجی cba بدهد
لطفا کمکم کنید.

mohammad7a
چهارشنبه 11 آذر 1394, 13:19 عصر
سلام علیکم دوستان
در مورد برنامه ای که یک رشته 100 تایی را معکوس کند. توضیح دهید

چه راه حلی مد نظر شما هست

اگر نمونهای دارید ذکر بفرمایید

به این شکل که :
ورودی

My name Is ali


>>> در خروجی

ali is name my
دقت کنید که حروف کلمات نباید معکوس شود فقط جای کلمات تغییر میکند

این رو میدونم که باید al رو مقایسه کنم با اسپیس مابین کلمات ولی مشکل من اینه که حروف هم تغییر می کند

سلام اساتید محترم

کسی کد کامل و اصلاح شده ی برنامه ای که دوستمون گفت رو داره ؟؟
لطف میکنید بفرستید ؟
خیلی واجبه