PDA

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



r_khan
سه شنبه 28 تیر 1390, 16:34 عصر
با سلام برنامه ای میخوام بنویسم که یک رشته حداکثر20 حرفی را از ورودی بگیرد و معکوس ان را نمایش دهد ممنون میشم راهنمایم کنید

tdkhakpur
سه شنبه 28 تیر 1390, 19:44 عصر
نمونه زیر میتونه رشته رو از ورودی بگیره و چاپ کنه برعکس شدن رشته کاری نداره فقط کافیه از اول تا نصف رشته ، رشته رو اسکن کنید و جای کاراکتر اولی رو با اخری عوض کنید این عمل رو ادامه بدید تا به کاراکتر وسطی برسید.


.MODEL SMALL
.STACK 100
.DATA
slist1 label byte
max1 db 50
len1 db ?
buf1 db 50 dup('$')
.CODE
push @data
pop ds

MOV AH, 0ah
LEA DX,slist1
INT 21H
mov ah, 2
mov dh, 10
mov dl, 10
mov bh, 0
int 10h
lea dx,buf1
mov ah,9h
int 21h
mov ax, 4c00h ; exit to operating system.
int 21h
END

xman_1365_x
سه شنبه 28 تیر 1390, 23:03 عصر
کد بالا ابن قسمتش رو


push @data
pop ds

تغییر بدین تا آدرس صحیح در ds قرار بگیره


mov ax,@data
mov ds,ax

برای نمابش معکوس هم طول بافر در len1 هست که به عنوان اندیس استفاده کنید و با کمک یک لوپ رشته رو بلعکس نمایش بدین
موفق باشی

tdkhakpur
چهارشنبه 29 تیر 1390, 00:12 صبح
کد بالا ابن قسمتش رو


push @data
pop ds

تغییر بدین تا آدرس صحیح در ds قرار بگیره


mov ax,@data
mov ds,ax


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

xman_1365_x
چهارشنبه 29 تیر 1390, 01:18 صبح
اینکه باید به صورتی که ارسال نمودید کد بشه درست و منطقی هست اما فرقی به حال اجرا نداره و بستگی به کامپایلر و نحوه لینک شدن داره که ایراد نگیره.
كد شما با tasm به درستي كار ميكنه اما با fasm نه خوب براي بررسي هر دو كد رو كه با tasm اسمبل شده ديباگ ميكنيم
خروجي برنامه با push و pop
72664
خروجي برنامه با حالت دوم
72663
پر واضحه اسمبلر خطا رو تشخيص داده و خودش كد هاي مناسب رو قرار داده 6 دستور!
اما در حالت استاندارد با 2 دستور انجام شده كه هم بدليل ثبات بودن بسيار سريع هست و هم دستور و بايت اشغالي كمتر و خيالمونم راحته روي هر اسمبلري كار ميكنه
موفق باشي

xman_1365_x
پنج شنبه 30 تیر 1390, 05:29 صبح
حالا که دو حالت رو دیباگ کردم بهتره روش دیگرو هم بگم که اطلاعات پایه ای تکمیل شه ،یک directive برای آماده سازی سگمنت داده داریم به اسم startup. و همینطور برای خاتمه برنامه exit. ودیباگ هم میکنم که ببینیم به اسمبلر میگه چه کدهایی رو جایگزین کنه
72735
همونطور که در شکل مشخصه اسمبلر بجای دایرکتیو startup دو دستور اول و چون من کدی بین برنامه نداشتم بلافاصله دایرکتیو exit هست که با دو دستور که وقفه آشنا برای پایان برنامه و و اجرا رو در اختیار رو سیستم عامل قرار میده
و در نهایت قالب کوتاه شده سگمنت ها به شکل زیر میباشد



.MODEL small, c ; This statement is required before you
; can use other simplified segment directives

.STACK ; Use default 1-kilobyte stack

.DATA ; Begin data segment

; Place data declarations here

.CODE ; Begin code segment
.STARTUP ; Generate start-up code

; Place instructions here

.EXIT ; Generate exit code
END

در خط اول نوع سگمنت ها رو مشخص میکنه برای اطلاعات بیشتر به این لینک (http://webster.cs.ucr.edu/Page_TechDocs/MASMDoc/ProgrammersGuide/Chap_02.htm)مراجعه کنید.