PDA

View Full Version : ادامه این برنامه را چطور بنویسم



csharpprogramer88
یک شنبه 29 آبان 1390, 19:25 عصر
سلام

من در اسمبلی تازه کارم لطفا کمکم کنید



;---------------------------------------
STSEG SEGMENT STACK 'STACK'

DB 32 DUP(?)

STSEG ENDS


;----------------------------------------

DTSEG SEGMENT 'DATA'

MSG1 DB "PLEASE ENTER A STRING : ",'$'
MSG2 DB "ENTER A CHAR : ",'$'


LIN DB 13,10,'$'
ST0 DB 50
ST_SIZE DB ?
ST1 DB 51 DUP(?)

ch1 db ?

DTSEG ENDS


;-----------------------------------------
CDSEG SEGMENT 'CODE'

ASSUME DS:DTSEG , SS:STSEG , CS:CDSEG

MAIN PROC
MOV AX,DTSEG
MOV DS,AX

;;;;;;;;;;;;;;show of a message
MOV AH,9
MOV DX,OFFSET MSG1
INT 21H

;;;;;;;;;;;;;read a string
MOV AH,10
MOV DX,OFFSET ST0
INT 21H

;;;;;;;;;;;;;;raftan b khate bad
MOV AH,9
MOV DX,OFFSET LIN
INT 21H

;;;;;;;;;;;;;;khandane yek karakter baraye serch dar yek kalame
MOV DX,OFFSET MSG2
INT 21H

;;;;;;;;;; read a 1 karakter
MOV AH,1
INT 21H
mov ch1,al



MOV AH,4CH
INT 21H

MAIN ENDP

CDSEG ENDS

END MAIN





با این قطعه کد ، من به کاربر پیغام میدم یک رشته را وارد کند پس از اینکه رشته را وارد کرد پیغام میدهم که یک کاراکتر را وارد کند

آیا تا اینجای کار ، کارم درست است ، چون تازه کارم لطفا به توضیحاتم توجه کنید آیا مفهوم دستورات را فهمدم؟

حالا باید این کارکتر در آن کلمه جستجو بشود (میخوام از دستور movsb استفاده کنم ) در صورتیکه پیدا نشد not found بدهد


برنامه را میخواهم با tasm اسمبل کنم



با تشکر از توجه شما

xman_1365_x
دوشنبه 30 آبان 1390, 13:23 عصر
اول اینکه دوست عزیز دیگه پیام خصوصی ندین و هنگام سوال صبور باشین تا دوستان جواب بدن
در ارتباط با سوالتون:

اولین ایراد اینه هر اندازه ای که میخواین کاربر ورودی بگیرین +1 کنید یعنی


ST0 DB 51
ST_SIZE DB ?
ST1 DB 51 DUP(?)

حال در این کد بافری تعریف میکنیم که بتونه از کاربر 50 کاراکتر بگیره و در بافر ذخیره کنه، پایان بافر رو 13 قرار میده برای همین یکی بیشتر از بازه مشخص تعریف کنید.

تا به اینجای کدتون درسته ،بهتره بجای دستور
MOV DX,OFFSET ST0
از
lea dx,st0
استفاده کنید،سریعتر هستش

توضیحاتی هم که نوشتین درسته فقط
;;;;;;;;;;;;;;khandane yek karakter baraye serch dar yek kalame
اگر منظور از این توضیح اینه متنی نمایش بده درست فهمیدی چون بالاترش نوشتین فرض بر این میگیرم حتما درست فهمیدن و هدف رو خواستین بیان کنید

خوب برای قسمت بعد هم بنویسید، بعد سعی میکنم راهنمایی کنم چی کار کنید
فقط یادتون باشه برای کار با رشته ها باید از es استفاده کنید ، به شکل زیر اول برنامه مقدار دهیش کنید یا اینکه یک اگسترا سگمنت براش تعریف کنید


mov ax, DTSEG
mov ds, ax
mov es, ax

csharpprogramer88
دوشنبه 30 آبان 1390, 23:00 عصر
تا اینجای کار من یک رشته را خواندم و یک کاراکتر را خواندم که طبق پست 2 کارم درسته
حالا چطور باید این کارکتر را در آن کلمه جستجو کنم اگر پیدا نشد not found بدهد

کدی را که از کتاب سیدرضی گرفتم را میزارم ولی این کد بدردم نمیخوره چون کارکتر مورد جستجو توسط کاربر وارد نمیشه و جمله نیز در خود کد برنامه تعیین شده است



MOV AX,DTSEG
MOV DS,AX
mov es,ax

cld
mov al,'R'
mov cl,6
lea DI,st0
repne SCASB
JNE EXIT
MOV AL,0FFH

EXIT:



MOV AH,4CH
INT 21H


چی کار کنم که خود کاربر کارکتری را که وارد کرده و در ککلمه ای که خودش وارد کرده جستجو کند؟

xman_1365_x
دوشنبه 30 آبان 1390, 23:56 عصر
خوب شما خودتون جواب رو نوشتین اما باید کمی بهش فکر میکردین حالا من کد رو طبق درخواستتون قرار میدم کد زیر جستجو میکنه و درصورت وجود یا عدم وجود کاراکتر مورد نظر پیغامی رو نمایش میده
در قسمت دیتا سگمنت


msgfound db 13,10, "exist your char in string$"
notmsgfound db 13,10, "not exist your char in string$"

در قسمت کد بعد از گرفتن کاراکتر کد زیر رو قرار بدین



cld
mov al,ch1 ;karakteri ke mikhayn jostojo konin
mov cx,50 ;toole reshte
lea DI,ST_1 ;buffer gerefte shode az karbar
repne SCASB ;jostogo
JNE notexist
MOV AL,1 ;peyda shode
jmp endsearch
notexist:
MOV AL,0 ;peyda nashode
endsearch:

cmp al,1
je showfound
jmp notfound
showfound:
mov ah,9
lea dx,msgfound
int 21h
jmp endshow
notfound:
mov ah,9
lea dx,notmsgfound
int 21h
endshow:

و اینکه نامST0 و ST1 را به ST_0 و ST_1 تغییر بدین چون این دو ثبات های fpu هستن
اگر بازم سوالی بود بپرسید!
موفق باشی