PDA

View Full Version : سوال: برنامه دريافت اعداد و مرتب سازي و...



Freedman66
دوشنبه 05 بهمن 1388, 19:22 عصر
سلام دوستان

برای نوشتن یک پروژه نیاز به کمک دارم. برنامه ای باید به زبان اسمبلی نوشته بشه که تعدادی عدد مثبت و منفي حداكثر 3 رقمي رو بگیره با قابلیت های زیر:

اعداد رو مرتب كنه صعودي و نزولي
عددي رو جستجو كنه و نمايش بده اگر پيدا نشد پيغام بده عدد يافت نشد
عدد وارد كنيم و اونو حذف كنه اگر نبود پيغام بده يافت نشد
عددي رو وارد كنه و در انتهاي اعداد قرار بده
امكان نمايش اعداد رو داشته باشه
از برنامه با دستوري خارج بشه


خواهش می کنم اگه کسی میتونه کمکم کنه.

$ M 3 H R D A D $
دوشنبه 05 بهمن 1388, 20:46 عصر
اگه اینو نوشتی یک میلیون بفروش خا؟

کدش زیاده

سرچ کن از اینترنت مخصوصا گوگل بهترین معلمه

Freedman66
سه شنبه 06 بهمن 1388, 15:39 عصر
خیلی لطف کردین. بی نهایت ممنون از راهنمایی تون. قرار نبود برنامه کامل نوشته بشه که. من یه بخشی از کد رو بلدم یه بخشی رو یکی دیگه بلده اینجوری سر هم میشه می شه برنامه.
حالا هیچ بخشی از این برنامه رو کسی بلد نیست؟!

$ M 3 H R D A D $
سه شنبه 06 بهمن 1388, 17:16 عصر
برنامه ای باید به زبان اسمبلی نوشته بشه که تعدادی عدد مثبت و منفی حداکثر 3 رقمی رو بگیره

این برنامه رشته ای از کاراکتر ها رو میگیره و به عدد تبدیل میکنه

تعدادشم تو CX



.MODEL SMALL

.STACK 64

.DATA

ARR DB 25,?,25 DUP(255)

TMP DW ?

NUM DW ?

OK DB "NUM IS TRUE$"

ER DB "NUM IS FALSE$"


.CODE
MAIN PROC FAR

MOV AX,@DATA
MOV DS,AX
MOV ES,AX
;----------------

CALL R_NUM


CMP NUM,321
JE LOK
; {
MOV AH,09H
LEA DX,ER
INT 21H
; }

JMP EXIT

LOK:
; {
MOV AH,09H
LEA DX,OK
INT 21H
; }



EXIT:
;-----------------
MOV AH,00H
INT 16H

MOV AX,4C00H
INT 21H

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

MAIN ENDP

R_NUM PROC

MOV AH,0AH
LEA DX,ARR
INT 21H

MOV AX,0
MOV SI,0
LEA SI,ARR

MOV CX,10

L1: MOV TMP,CX

CMP [SI],'0'
JNAE L2
CMP [SI],'9'
JNBE L2
MOV CX,10
MUL CX
MOV CL,[SI]
AND CX,000FH
ADD AX,CX
L2: INC SI
MOV CX,TMP
LOOP L1

MOV NUM,AX

RET

R_NUM ENDP



END MAIN


یک حقه درست کن واسه تعداد و چون 3 رقمی حدگثر 999 یعنی 2 بایت و هر عددی که میگیری تو خونه های متوالی یک متغییر 2 بایتی قرار بده

$ M 3 H R D A D $
سه شنبه 06 بهمن 1388, 17:42 عصر
اینم جستجو که یک بایتی و نوشتم تبدیل به 2 بایتیش با خودت

یک حلقست که 5 بار تکرار میشه

و اگه عددی که تو متغییر NUM2 وجود داره با اولین عددی که تو آرایه وجود داره و اندیس های آرایه هم با BX مشخص شده و پیدا کنه شماره اندیس و چاپ میکنه و اگرم پبدا نکرد چاپ میکنه پیدا نشد.



.MODEL SMALL

.STACK 64

.DATA

NUM DB 9,8,5,4,6

NUM2 DB 9

FLAG DB 0

ER DB "NOT FOUND$"

.CODE
MAIN PROC FAR

MOV AX,@DATA
MOV DS,AX
MOV ES,AX
;------------------

MOV CX,5
MOV BX,0

FOR:

MOV AL,NUM[BX]
CMP AL,NUM2
JE LOK
MOV FLAG,0
INC BX
JMP CONTINUE
LOK:
MOV FLAG,BL
JMP L1

CONTINUE:LOOP FOR

CMP FLAG,0
JNE L1
MOV AH,09H
LEA DX,ER
INT 21H
JMP EXIT

L1:

ADD FLAG,30H

MOV AH,02H
MOV DL,FLAG
INT 21H

EXIT:
;------------------
MOV AH,00H
INT 16H

MOV AX,4C00H
INT 21H
;------------------

MAIN ENDP
END MAIN

$ M 3 H R D A D $
سه شنبه 06 بهمن 1388, 17:52 عصر
عدد وارد کنیم و اونو حذف کنه اگر نبود پیغام بده یافت نشد


داریم با عدد کار میکنیم

با اون برنامه بالایی که جستجو میکرد میتونی بفهمی عدد وجود داره یا نه
اگه نبود که معلومه پبغام چاپ میشه
اما اگه عدد بود میای برای میگی



MOV NUM[اندیس عدد پیدا شده],'a'


یعنی برای خودت فرض میکنی برای حذف بجاش کاراکتر بزار
و موقعی که میخوای دوباره از اعداد استفاده کنی باید اولش تشخیص بدی عدد هست یا نه:





MOV BX,0

MOV AL,NUM[BX]
CMP AL,30H
JB L1
CMP AL,39H
JA L1
;-------------
; IS NUMBER
;-------------
L1:
;-------------
; NOT NUMBER
;-------------




BX اندیس ها را نگه میداره و هر عدد اگه تو بازه 30 هگز تا 39 هگز نبود یعنی عدد نیست در واقع همو خونه ای که ما حذف کردیم

$ M 3 H R D A D $
سه شنبه 06 بهمن 1388, 17:57 عصر
عددی رو وارد کنه و در انتهای اعداد قرار بده


خوب اگه منو بذاری که یک قسمتش اضافه کردن عدد باشه
باید هر موقه که میخوای عدد بگیری توی یک متغغیر تعداد عددی که گرفتی و نگه داشته باشی
یعنی به اون متغییر مقدار صفر بدی که برای بار اول که اون تابع برای اضافه کردن عدد فراخوانی میشه عدد و بریزه تو خونه ی 0 ام و بعد یکی بهش اضافه کنی


اینجوری وقتی عدد میگیری میریزی تو آخرین خونه

$ M 3 H R D A D $
سه شنبه 06 بهمن 1388, 17:58 عصر
برای خروج از برنامه هم از لیبل خروج مثل EXIT تو آخرین خط برنامت استفاده کن که تحت شرایتی JMP کن به اونجا

Freedman66
چهارشنبه 07 بهمن 1388, 10:49 صبح
ممنونم
خیلی به دردم خورد، لطف کردید

$ M 3 H R D A D $
چهارشنبه 07 بهمن 1388, 13:23 عصر
من اخلاقم اینه که اگه یک الگوریتم یا کد فکرم و مشغول کنه باید تمومش کنم

شخصا با ذوق میام تو این فروم و اگه یک دهم درصد هم بلد باشم جواب میدم

خواهشا سواال میکنی زود بیا دنبالش نه اینکه 1 روز بگذره

Freedman66
جمعه 09 بهمن 1388, 15:11 عصر
دوست عزیز! من در حال امتحان دادن هستم و اگر تاخیری داشتم به خاطر همین بود!

ممنون از راهنماییت

mehrara_bolouri
جمعه 09 بهمن 1388, 15:32 عصر
سلام این برنامه sort رو انجام میده ممکن به دردت بخوره
model small
.data
maxlen db 26
actlen db ?
str1 db 26 dup(?)
msg1 db 0dh,0ah,'please enter your names(max. 20 names): ',0dh,0ah,'$'
msg2 db 0dh,0ah,'result is : ',0dh,0ah,'$'
names db 20 dup(25 dup(' '),0dh,0ah),'$'
crlf db 0dh,0ah,'$'
countrn db 20
.code
main proc
mov ax,@data
mov ds,ax
mov es,ax
lea dx,msg1
call print_string
call read_names
call sort
lea dx,msg2
call print_string
lea dx,names
call print_string
mov ah,4ch
int 21h
main endp
read_string proc
mov ah,10
mov dx,offset maxlen
int 21h
ret
read_string endp
print_string proc
mov ah,9
int 21h
ret
print_string endp
read_names proc
lea bp,names
mov cx,20
read_loop:
lea dx,crlf
call print_string
call read_string
push cx
mov di,bp
lea si,str1
mov cl,actlen
or cl,cl
jz end_read
mov ch,0
rep movsb
pop cx
add bp,27
loop read_loop
jmp end_pro
end_read:
pop cx
sub countrn,cl
end_pro:
ret
read_names endp
sort proc
lea si,names
mov cl,countrn
or cl,cl
jz end_sort
dec countrn
mov ch,0
or cl,cl
jz end_sort
loop1:
mov di,si
add di,27
push cx
loop2:
call compare
add di,27
loop loop2
pop cx
add si,27
loop loop1
end_sort:
ret
sort endp
compare proc
push cx
push di
push si
mov cx,25
repe cmpsb
jcxz end_cmp
jb end_cmp
pop si
push si
lea di,str1
mov cx,25
rep movsb
pop di
pop si
push si
push di
mov cx,25
rep movsb
pop si
pop di
push di
push si
lea si,str1
mov cx,25
rep movsb
end_cmp:
pop si
pop di
pop cx
ret
compare endp
end main