نمایش نتایج 1 تا 2 از 2

نام تاپیک: برنامه با 8086

  1. #1

    برنامه با 8086

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

  2. #2

    نقل قول: برنامه با 8086

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

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


تاپیک های مشابه

  1. کد ماشین حساب در اسمبلی 8086
    نوشته شده توسط ehsan*ehsan در بخش مباحث عمومی کار با سخت افزارها، سنسورها و لوازم جانبی
    پاسخ: 8
    آخرین پست: سه شنبه 22 مرداد 1398, 13:53 عصر
  2. کمک کمک در انجام یک پروژه ساده اسمبلی خواهشا کمک کنید 8086
    نوشته شده توسط evenger در بخش برنامه نویسی اسمبلی خانواده x86
    پاسخ: 2
    آخرین پست: سه شنبه 24 خرداد 1390, 20:08 عصر
  3. سوال: کلا 8086 چیه ؟
    نوشته شده توسط Saeed113 در بخش برنامه نویسی اسمبلی خانواده x86
    پاسخ: 2
    آخرین پست: جمعه 07 آبان 1389, 23:04 عصر
  4. emu 8086
    نوشته شده توسط m.mahnani در بخش برنامه نویسی اسمبلی خانواده x86
    پاسخ: 3
    آخرین پست: پنج شنبه 09 اردیبهشت 1389, 21:11 عصر

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •