ورود

View Full Version : برنامه با 8086



morteza373
شنبه 11 مرداد 1399, 12:03 عصر
سلام خسته نباشید
من یه کد اسمبلی برای 8086 دارم که میاد یه سری اطلاعات مثل نام ، شماره حساب و موجودی رو از کاربر میگیره و در آخر نمایش میده(اطلاعات 10 تا کاربر رو میخوام بگیره)
اول اینکه وقتی تا 7تا کاربر میگیره مشکلی نداره ولی از 8 به بعد دیگه روی صفحه نمایش هیچی چاپ نمیشه یه جورایی هنگ میکنه .
دوم اینکه نمیدونم چطور باید اطلاعات رو بر اساس موجودی مرتب کنم به صورت نزولی.
دوستان لطفا راهنمایی کنید تمرین دانشگاهه تا امشب وقت داره
ممنون.




;Defined Macros to use in program.
;-------------------------------------------------------
Pause macro
mov ah,00
int 16h
endm

;-------------------------------------------------------
Clear_screen macro
mov ah,06h
mov al,10
mov ch,0
mov cl,0
mov dl,200
mov dh,200
int 10h

mov ah,02h ;brings new displayed content back to the deleted line
mov dh,0
mov dl,0
mov bh,0
int 10h
endm
;-------------------------------------------------------
Date macro

Day:
mov ah,2ah ;To get System Date
int 21h
mov al,dl ;Day is in DL
aam ;As our day includes 2 digits, we use aam to have the
;day number divided and set in AH and AL (All in AX>
mov bx,ax
call display

mov dl,'/'
mov ah,02h ; To Print / in
int 21h

Month:
mov ah,2ah ; To get System Date
int 21h
mov al,dh ; Month is in DH
aam
mov bx,ax
call display

mov dl,'/' ; To Print / in DOS
mov ah,02h
int 21h


Year:
mov ah,2ah ; To get System Date
int 21h
add cx,0f830h ; As year format cannot be shown like YYYY using
; in-hand Registers, we are supposed to make it like
; YY (2020 --> 20> ,since AAM is applicable only for
; AL (YYYY -> YY)
mov ax,cx
aam
mov bx,ax
call display

mov dl, 10 ; setting 10 and 13 to be printed, performs as '\n'
mov ah, 02h
int 21h
mov dl, 13
mov ah, 02h
int 21h
endm

;------------------------------------------------
Time macro
mov ah,2ch
int 21h

mov dl,ch
call Integer_to_Ascii ; values from 2ch are all integers that must
; be transfromed into strings to be printed

mov ah,02h ; to seprate each part in form of <hh:mm:ss>
mov dl,':'
int 21h

mov dl,cl
call Integer_to_Ascii

mov ah,02h ; to seprate each part in form of <hh:mm:ss>
mov dl,':'
int 21h

mov dl,dh
call Integer_to_Ascii

MOV dl, 10
MOV ah, 02h ; setting 10 and 13 to be printed, performs as '\n'
INT 21h
MOV dl, 13
MOV ah, 02h
INT 21h

endm


;;;;;;;;;;;;;;;;;;;;;
gap macro
pusha
MOV dl, 10
MOV ah, 02h
INT 21h
MOV dl, 13
MOV ah, 02h
INT 21h
popa
endm

;------------------------------------------------
.model small
.stack 100h
.data


Count db ?
C_Time db "Time : $"
C_Date db "Date : $"


password db '149ad'
Take_password db "Enter password: $"
Wrong_password db ,0dh,0ah,"Password is incorrect. Do you want to try again?(y/n) --> $"
Welcome db "Welcome","$"

yn label byte
max_yn db 2
len_yn db ?
yn_num db 2 dup(' ')

check label byte
max_check db 31
len_check db ?
check_num db 31 dup(' ')


len_password db ?
max_password db 31


Wrong_password2 db ,0dh,0ah,"Do you want to try again?(y/n) --> $"



yn2 label byte
max_yn2 db 2
len_yn2 db ?
yn_num2 db 2 dup(' ')


coun db 0

msg1 db "Name : ","$"
msg2 db "Account : ","$"
msg3 db "Deposit : ","$"

str1 db 200 dup('$'),'$'

str2 db 200 dup('$'),'$'

str3 db 200 dup('$'),'$'

per label byte
max db 10
len db ?
pernum db 10 dup(' '),"$"

acc label byte
max_acc db 10
len_acc db ?
accnum db 10 dup(' '),"$"

dep label byte
max_dep db 10
len_dep db ?
depnum db 10 dup(' '),"$"

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

.code
start:
mov ax,@data
mov ds,ax

mov len_password,5

entry:
;Clear-screen macro for clearing the screen
Clear_screen

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

lea dx,check
mov ah,0ah
int 21h

mov ax,0
mov al,len_password
mov ah,len_check
cmp al,ah
je pass

again:
mov ax,0
mov cx,0
mov bx,0
mov dx,0
mov Count,0

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

lea dx,yn
mov ah,0ah
int 21h

mov bl,yn_num
cmp bl,'n'
je finish
cmp bl,'y'
je entry
jmp again

finish:
mov ah,4ch
int 21h

pass:

lea di,password
lea si,check_num
mov cx,0
mov dx,0
mov cl,len_password

l1:
mov dl,byte ptr[di]
mov dh,byte ptr[si]
cmp dl,dh
jne again
inc di
inc si
inc Count
loop l1

mov cl,Count
cmp cl,len_password
jne again

;Clear-screen macro for clearing screen.
Clear_screen

;Print Current Date.
lea dx,C_Date
mov ah,09h
int 21h
Date

;Print Current Time.
lea dx,C_Time
mov ah,09h
int 21h
Time

;Print Welcome.
mov ah, 2h ;cursor move
mov dh, 10
mov dl, 30
mov bh, 0
int 10h
lea dx,Welcome
mov ah,09h
int 21h


;Pause until key press
Pause

;Clear screen
Clear_screen
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;----------- start ------------;

againn:



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

lea dx,per
mov ah,0ah
int 21h



mov al, 10
mov bl, coun
mul bl

mov dx,0

mov di, offset str1
mov si, offset pernum
add di,ax

mov ch, 0
mov cl, len
More:
mov al, [si]
mov [di], al
inc si
inc di
loop More

mov al, 10
mov bl, coun
mul bl

lea di, str1
mov cl, len
add di, ax
lp1:
mov dl,[di]
inc di

loop lp1


gap

mov ax,0
mov bx,0
mov cx,0
mov dx,0

;--------- test 2 ------------;

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

lea dx,acc
mov ah,0ah
int 21h



mov al, 10
mov bl, coun
mul bl

mov dx,0

mov di, offset str2
mov si, offset accnum
add di,ax
mov ch, 0
mov cl, len_acc
mov ax,0
More1:
mov al, [si]
mov [di], al
inc si
inc di
loop More1

mov al, 10
mov bl, coun
mul bl
lea di,str2
mov cl,len_acc
add di,ax
lp2:
mov dl,[di]
inc di

loop lp2

gap


;--------- test 3 ------------;

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

lea dx,dep
mov ah,0ah
int 21h



mov al, 10
mov bl, coun
mul bl

mov dx,0

mov di, offset str3
mov si, offset depnum
add di,ax
mov ch, 0
mov cl, len_dep
More2:
mov al, [si]
mov [di], al
inc si
inc di
loop More2

mov al, 10
mov bl, coun
mul bl
lea di,str3
mov cl,len_dep
add di,ax

lp3:
mov dl,[di]
inc di

loop lp3

inc coun
cmp coun,10
je finishh


again22:
mov ax,0
mov cx,0
mov bx,0
mov dx,0


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

lea dx,yn2
mov ah,0ah
int 21h


mov bl,yn_num2
cmp bl,'n'
je finishh
cmp bl,'y'
je entry11
jmp again22




entry11:
;Clear-screen macro for clearing the screen
Clear_screen
jmp againn

finishh:
;--------------------------------;
Clear_screen


mov di,0



;--- all names ---;
lea di,str1
Pp1:
mov dl,[di]
inc di
mov ah,02h
int 21h
cmp dl,'$'
jne Pp1

gap

;--- all accounts ---;
lea di,str2
Pp2:
mov dl,[di]
inc di
mov ah,02h
int 21h
cmp dl,'$'
jne Pp2

gap

;--- all deposits ---;
lea di,str3
Pp3:
mov dl,[di]
inc di
mov ah,02h
int 21h
cmp dl,'$'
jne Pp3
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;FINISHED
mov ah,4ch
int 21h


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

Integer_to_Ascii proc
push bx
push ax ;Save registers used

xor ax, ax ;AX = 0
mov al, dl ;AX = DL

mov bl, 10d
div bl ;AL = AX/10, AH = AX mod 10

;AX contains the digits

add ax, 3030h ;Transform digit to digitals


mov bx, ax ;Save for later

;Show the digits
mov dl, bl
mov ah, 02h
int 21h

mov dl, bh
int 21h

pop ax
pop bx
ret

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

display proc
mov dl,bh ; Since the values are in BX, BH Part
add dl,30h ; ASCII Adjustment
mov ah,02h ; To Print in DOS
int 21h
mov dl,bl ; BL Part
add dl,30h ; ASCII Adjustment
mov ah,02h ; To Print in DOS
int 21h
ret

end start

farhad_shiri_ex
یک شنبه 12 مرداد 1399, 09:48 صبح
اول اینکه وقتی تا 7تا کاربر میگیره مشکلی نداره ولی از 8 به بعد دیگه روی صفحه نمایش هیچی چاپ نمیشه یه جورایی هنگ میکنه .

وقتی از دستور loop استفاده میکنید باید قبلش ثبات cx را با مقدار مناسبی که قراره حلقه شما اجرا بشه، مقدار دهی کنید. در صورتی که شما در حلقه هایی که از دستور loop استفاده کردید مقدارهای len , len_acc , len_dep را مقدار دهی نکردید و به صورت مقدار نامشخص تعریف کردید که اسمبلر پیش فرض مقدار 0 قرار میده بنابراین حلقه شما اولین بار که اجرا بشه از 0 یکی کم میکنه و مقدار لوپ حلقه بع تعداد ff-ff بار اجرا خواهد شد و طبیعتا بعد از یک تعدادی که در آرایه ها نوشته بشه سیستم عامل هنگ میکنه ویا خطا تولید میکنه




دوم اینکه نمیدونم چطور باید اطلاعات رو بر اساس موجودی مرتب کنم به صورت نزولی.

یک روش خوب برای مرتب سازی این هست که، در زمان دریافت عدد موجودی این اعداد را به صورت مرتب شده از بزرگ به کوچک در آرایه ذخیره کنید، اینطوری آرایه ای که دارید همیشه مرتب خواهد بود ونیازی نیست هربار پردازش جداگانه ای روی داده ها داشته باشید
و اگر هم که بخواهید از یک الگوریتم مرتب سازی جداگانه برای آرایه مورد نظر استفاده کنید کافی است که آرایه را در یک حلقه با یک الگوریتم معتبر مثل Binary Sort , Bubble sort ,Quick sort,... استفاده کنید