Sunday, 19 April 2015

b2h

section .data
   

         menu         db       10,"-----------Menu----------"
            db     10,"1. Hex to BCD "
            db     10,"2. BCD to Hex"
            db     10,"3. Exit "
            db    10
            db     10,"Enter your choice: "
    menu_len:    equ     $-menu
   
        hbmsg  db     10,"Hex to BCD "
            db     10,"Enter 4-digit Hex number: "
        hbmsg_len:    equ     $-hbmsg

            bhmsg      db     10,"BCD to Hex "
            db     10,"enter 5-digit BCD number: "
    bhmsg_len:    equ     $-bhmsg

    hmsg   db       10,13,"Equivalent Hex number is:"
    hmsg_len:    equ     $-hmsg
   
    bmsg           db     10,13,"Equivalent BCD number is: "
    bmsg_len:    equ     $-bmsg

section .bss
   
      buf         resb     6
    buf_len:    equ    $-buf

    digitcount    resb    1

    ans        resw    1
    char_ans    resb    4

%macro dispmsg 2       
    mov rax,4       
    mov rbx,1       
    mov rcx,%1       
     mov rdx,%2       
    int 80h           
%endmacro

%macro accept 2       
    mov rax,3          
    mov rbx,1       
    mov rcx,%1       
    mov rdx,%2       
    int 80h
%endmacro

section .text
    global _start
_start:
menum:       
    dispmsg    menu, menu_len
    accept buf,buf_len  
        mov    al,[buf]

case1:    cmp     byte[buf],'1'
    jne     case2
    call     hex_bcd
    jmp menum
   

case2:    cmp     byte[buf],'2'
    jne     case3
    call bcd_hex
   
case3:    cmp     byte[buf],'3'
    je exit
 jmp menum

exit:
       mov rax,1
    mov rbx,0
    int 80h
hex_bcd:
    dispmsg    hbmsg, hbmsg_len

    call     accept_16
    mov     ax,bx

    mov     rbx,10
back:
    xor     rdx,rdx
    div     rbx

    push     dx
    inc     byte[digitcount]

    cmp     rax,0h
    jne     back

    dispmsg    bmsg, bmsg_len
;--------------------------------------------------------------------------------------------
print_bcd:
pop     dx
add     dl,30h                   
mov    [char_ans],dl               
   
    dispmsg    char_ans,1            
    dec     byte[digitcount]
    jnz     print_bcd

    ret

bcd_hex:
    dispmsg    bhmsg, bhmsg_len
    accept    buf,buf_len       
    mov    rsi,buf           
    xor    rax,rax           
    mov     rbx,10       
    mov     rcx,05               

back1:
xor    rdx,rdx                   
mul     ebx         

    xor    rdx,rdx
    mov     dl,[rsi]                    
    sub     dl,30h       
     add rax,rdx

    inc     rsi

    dec    rcx
    jnz    back1

    mov    [ans],ax

    dispmsg    hmsg, hmsg_len
    mov    ax,[ans]
    call    display_16

    ret

accept_16:
    accept buf,5       
    xor     bx,bx
    mov     rcx,4
    mov     rsi,buf

next_digit:    shl    bx,04
        mov    al,[rsi]
               cmp    al,39h
                jbe    sub30   
        sub        al,7h         

sub30:  sub        al,30h         
        add    bx,ax       
    inc    rsi       
    loop    next_digit
ret

display_16:
    mov     rsi,char_ans+3   
    mov     rcx,4       

cnt:    mov     rdx,0       
    mov     rbx,16       
    div     rbx
    cmp     dl, 09h       
    jbe      add30
    add      dl, 07h
add30:
    add     dl,30h       
    mov     [rsi],dl   
    dec     rsi       

    dec     rcx       
    jnz     cnt       
   
    dispmsg char_ans,4   
ret

No comments:

Post a Comment