سلام خسته نباشید
من یه کد اسمبلی برای 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