PDA

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



iran_sky
جمعه 19 آذر 1389, 09:21 صبح
با سلام به دوستان عزیز
من میخوام ابتدا رشته abcd را گرفته سپس به این صورت چاپ کند cdab
اما با این کد به این صورت چاپ میکند cda

کد:


datasg segment para 'code'
msg1 db 'Enter a string:',"$"
msg2 db 'Change string is :',"$"
strlist1 label byte ;start of parameter list1
max1 db 5
len1 db ?
buffer1 db 5 dup(' ')
dolar1 db '$'
strlist2 label byte ;start of parameter list2
max2 db 5
len2 db ?
buffer2 db 5 dup(' ')
dolar2 db '$'
datasg ends
codesg segment para 'code'
main proc far
assume ds:datasg, cs:codesg
mov ax, datasg
mov ds, ax
mov ah, 6h ;clear screen
mov al, 25 ;number of rows
mov ch, 0
mov cl, 0
mov dh, 24 ;row
mov dl, 79 ;column
mov bh, 7 ;attribute
int 10h
mov ah, 2h ;cursor move
mov dh, 10 ;row
mov dl, 30 ;column
mov bh, 0 ;page number
int 10h
lea dx, msg1
mov ah, 9h
int 21h
mov ah, 0ah
lea dx, strlist1
int 21h
mov ah, 2h ;cursor move
mov dh, 12 ;row
mov dl, 30 ;column
mov bh, 0 ;page number
int 10h
mov ah, 0
mov dx, offset msg2
mov ah, 9h
int 21h
; output the string char by char
lea bx, buffer1
mov ch, 0
mov cl, len1
sub cl, 2
add bx, cx ; the end of string
;mov cl, 0 ; counter of loop
p1:
mov dl, [bx]
mov ah, 2h
int 21h
inc cl
inc bx

cmp cl,len1
jnz p1

sub cl,4
sub bx,4
mov dl,[bx]
mov ah,2h
int 21h

cmp cl,len1
jnb p1


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


اما میخوام بعد از این کار ابتدا رشته cdab در یک لیست پارامتری قرار بگیرد سپس چاپ شود

iran_sky
جمعه 19 آذر 1389, 21:28 عصر
کسی نیست کمکم کنه

xman_1365_x
جمعه 19 آذر 1389, 22:47 عصر
چرا تاپيك اول رو حذف كردين؟ همون رو ويرايش ميكردين
من در تاپيك قبل گفتم وقتي c,d نمايش دادي بري به اول و دو بار هم اونجا نمايش بدي
اين كد خوبه؟
فقط بهتر بنويسيد اينو دو تا حلقه كه دو دو بار بچر خه كه اگر n خانه داشتيم راحت بشه گفت تعداد چرخش رو


datasg segment para 'code'
msg1 db 'Enter a string:',"$"
msg2 db 'Change string is :',"$"
strlist1 label byte ;start of parameter list1
max1 db 5
len1 db ?
buffer1 db 5 dup(' ')
dolar1 db '$'
strlist2 label byte ;start of parameter list2
max2 db 5
len2 db ?
buffer2 db 5 dup(' ')
dolar2 db '$'
datasg ends
codesg segment para 'code'
main proc far
assume ds:datasg, cs:codesg
mov ax, datasg
mov ds, ax
mov ah, 6h ;clear screen
mov al, 25 ;number of rows
mov ch, 0
mov cl, 0
mov dh, 24 ;row
mov dl, 79 ;column
mov bh, 7 ;attribute
int 10h
mov ah, 2h ;cursor move
mov dh, 10 ;row
mov dl, 30 ;column
mov bh, 0 ;page number
int 10h
lea dx, msg1
mov ah, 9h
int 21h
mov ah, 0ah
lea dx, strlist1
int 21h
mov ah, 2h ;cursor move
mov dh, 12 ;row
mov dl, 30 ;column
mov bh, 0 ;page number
int 10h
mov ah, 0
mov dx, offset msg2
mov ah, 9h
int 21h
; output the string char by char
lea bx, buffer1
mov ch, 0
mov cl, len1
sub cl, 2
add bx, cx ; the end of string
;mov cl, 0 ; counter of loop
xor si,si

p1: ;print c,d
mov dl, [bx]
mov buffer2+[si], dl
mov ah, 2h
int 21h
inc cl
inc bx
inc si
cmp cl,len1
jnz p1

;print a
sub cl,4
sub bx,4
mov dl,[bx]
mov buffer2+[si], dl
mov ah,2h
int 21h
;prin b

inc si
inc cl
inc bx
mov dl,[bx]
mov buffer2+[si], dl
mov ah,2h
int 21h


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

iran_sky
جمعه 19 آذر 1389, 22:57 عصر
ممنون دوست عزیز
میشه بگی این دستورات چکاری انجام میده

xor si,si

mov buffer2+[si], dl


و اینکه چرا چاپ a و b جدا نوشتی مگه نمیشد با هم ترکیب کنی

xman_1365_x
جمعه 19 آذر 1389, 23:03 عصر
(خواهش ميكنم دوست عزيز اما براي تشكر پايين كامنتم سمت راست تشكر هست روش كليك كنيد سريعتر هست تا نوشتن)
دستور اول هرچي در رجيستر باشه 0 ميكنه مثل اينكه بگي mov si,0 اما اين سريعتر هست!
دومي هم براي اينكه خواستي بريزي مقدار رو در ليست پيوندي دوم
براي چاپ a ,b بله خودمم كه بالا گفتم ميشه ديدم شما اينطوري نوشتي جدا نوشتم نكتشو متوجه شي و گفتم هر دوي اين هارو در تو تا حلقه با چرخش 2 بزار
تعداد دستورات كم ميشه=اجراي سريعتر

iran_sky
جمعه 19 آذر 1389, 23:07 عصر
دوست عزیز تشکر رو زدم

iran_sky
جمعه 19 آذر 1389, 23:10 عصر
چطوری میشه برنامه p1 رو در یک یا دو حلقه اجرا کنیم
و اینکه si در این برنامه چیست؟

xman_1365_x
جمعه 19 آذر 1389, 23:18 عصر
خوب به عنوان نكته به شما سپردم اگرنه خودم مينوشتم! معلومه خودتون ننوشتين اين سورس رو اگرنه مشكلي نداشتين
اگر اينو در emu8086 اجرا كرديد كمي به bx ,cx نگاه كنيد متوجه ميشيد
اما همينم خوبه زياد سخت نگيريد :لبخند:

iran_sky
جمعه 19 آذر 1389, 23:23 عصر
si در این برنامه چیست؟

xman_1365_x
جمعه 19 آذر 1389, 23:34 عصر
بافر شما ليستي از نوع بايت هست خوب آدرس شروع در bx هست بعد كه اولين مقدار رو ميريزم در بافر بعد بايد بافر به آدرس بعدي يعني خانه دوم اشاره كنه
تا مقدار بعدي در ادرس بعد قرار بگيره شما برش دار ببين چه اتقاقي براي بافر ها در انتها ميوفته!
در emu8086 روي var كليك كنيد مقادير حافظه رو ببينيد!