Advertisement
Eternoseeker

assignment 4

Apr 27th, 2023
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
ASM (NASM) 4.11 KB | Source Code | 0 0
  1.  
  2. section .data
  3.         nline       db  10,10
  4.     nline_len   equ $-nline
  5.  
  6.     ano     db  10,"    Assignment no   :3",
  7.             db  10,"------------------------------------------------------------",
  8.             db      10,"    Assignment Name:Conversion From HEX to BCD and BCD to HEX Number.",
  9.             db      10,"----------------------------------------------------------",10
  10.     ano_len     equ $-ano
  11.  
  12.     menu        db  10,"1.Hex To BCD.",
  13.             db  10,"2.BCD To Hex.",
  14.             db  10,"3.Exit."
  15.             db  10,"Enter Your Choice::"
  16.     menu_len    equ $-menu
  17.  
  18.     hmsg        db  10,"Enter 4 digit Hex Number::"
  19.     hmsg_len    equ $-hmsg
  20.  
  21.     bmsg        db  10,"Enter 5 digit BCD Number::"
  22.     bmsg_len    equ $-bmsg
  23.  
  24.     ebmsg       db  10,"The Equivalent BCD Number is::"
  25.     ebmsg_len   equ $-ebmsg
  26.  
  27.     ehmsg       db  10,"The Equivalent Hex Number is::"
  28.     ehmsg_len   equ $-ehmsg
  29.  
  30.     emsg        db  10,"INVALID NUMBER INPUT",10
  31.     emsg_len    equ $-emsg
  32. ;------------------------------------------------------------------------------
  33. section .bss
  34.     buf     resB    6
  35.     char_ans    resB    4
  36.     ans     resW    1
  37.    
  38. ;-----------------------------------------------------------------------------
  39.  
  40. %macro  Print   2
  41.      MOV    RAX,1
  42.      MOV    RDI,1
  43.          MOV    RSI,%1
  44.          MOV    RDX,%2
  45.     syscall
  46. %endmacro
  47.  
  48. %macro  Read    2
  49.      MOV    RAX,0
  50.      MOV    RDI,0
  51.          MOV    RSI,%1
  52.          MOV    RDX,%2
  53.     syscall
  54. %endmacro
  55.  
  56.  
  57. %macro Exit 0
  58.     Print   nline,nline_len
  59.     MOV RAX,60
  60.         MOV RDI,0
  61.     syscall
  62. %endmacro
  63. ;---------------------------------------------------------------      
  64.  
  65. section .text
  66.     global _start
  67.  
  68. _start:
  69.         Print   ano,ano_len
  70.    
  71. MENU:   Print   menu,menu_len
  72.     Read    buf,2       ;accept choice i.e 1 digit+enter
  73.  
  74.     mov al,[buf]    ;contains only digit character
  75.  
  76. c1: cmp al,'1'
  77.     jne c2
  78.     call    HEX_BCD
  79.     jmp MENU
  80.  
  81. c2: cmp al,'2'
  82.     jne c3
  83.     call    BCD_HEX
  84.     jmp MENU
  85.  
  86. c3: cmp al,'3'
  87.     jne invalid
  88.     Exit
  89.  
  90. invalid:
  91.     Print   emsg,emsg_len
  92.     jmp MENU
  93. ;---------------------------------------------------------------
  94.  
  95. HEX_BCD:
  96.     Print   hmsg,hmsg_len
  97.     call    Accept_16       ;accept 4 digit hex number
  98.     mov ax,bx           ;mov hex number in ax
  99.  
  100.     mov bx,10           ;for divide hex number by 10
  101.     xor bp,bp           ;counter
  102.    
  103. back:   xor dx,dx           ;as dx each time contains remainder
  104.     div bx          ;divide ax by 10 ax=Q,dx=R
  105.     push    dx          ;push dx on stack as it is bcd
  106.     inc bp          ;inc counter by 1
  107.    
  108.     cmp ax,0            ;compare whether Q is 0 if 0 means number get over
  109.     jne back            ;mov to conversion of quotient
  110.  
  111.     Print   ebmsg,ebmsg_len
  112.  
  113. back1:  pop dx          ;pop last digit pushed on stack
  114.     add dl,30h          ;add 30 to digit to make them decimal
  115.     mov [char_ans],dl       ;print individual digit
  116.     Print   char_ans,1
  117.  
  118.     dec bp 
  119.     jnz back1           ;mov to next digit
  120.  
  121. RET
  122. ;---------------------------------------------------------------
  123.  
  124. BCD_HEX:
  125.     Print   bmsg,bmsg_len
  126.     Read    buf,6       ;5 digit + 1 enter
  127.  
  128.     mov rsi,buf     ;Points at the start of buffer
  129.     xor ax,ax       ;Previous digit =0
  130.     mov rbp,5       ;counter
  131.     mov rbx,10      ;multiplier
  132.    
  133. next:   xor cx,cx       ;contains next digit each time
  134.     mul bx      ;(ax*bx)+cl
  135.     mov cl,[rsi]
  136.     sub cl,30h
  137.     add ax,cx
  138.  
  139.     inc rsi     ;Point at the next digit
  140.     dec rbp
  141.     jnz next
  142.  
  143.     mov [ans],ax    ;store ax in ans because ax get change in Print macro
  144.     Print   ehmsg,ehmsg_len
  145.    
  146.     mov ax,[ans]
  147.     call    Disp_16     ;Print hex number  
  148.    
  149.    
  150.    
  151. RET
  152. ;---------------------------------------------------------------
  153. Disp_16:                ;Hex to Ascii(character) display
  154.     MOV RSI,char_ans+3
  155.     MOV RCX,4               ;counter
  156.     MOV RBX,16          ;Hex no
  157.  
  158. next_digit:
  159.     XOR RDX,RDX
  160.     DIV RBX
  161.  
  162.     CMP DL,9   
  163.     JBE add30
  164.     ADD DL,07H
  165.  
  166. add30   :
  167.     ADD DL,30H
  168.     MOV [RSI],DL
  169.  
  170.     DEC RSI
  171.     DEC RCX
  172.     JNZ next_digit
  173.  
  174.     Print   char_ans,4
  175. ret
  176. ;-------------------------------------------------------------------
  177. Accept_16:              ;Ascii(character) to hex number input
  178.     Read    buf,5
  179.  
  180.     MOV RCX,4
  181.     MOV RSI,buf
  182.     XOR BX,BX
  183.  
  184. next_byte:
  185.     SHL BX,4
  186.     MOV AL,[RSI]
  187.    
  188.     CMP AL,'0'
  189.     JB  error
  190.     CMP AL,'9'
  191.     JBE sub30
  192.  
  193.     CMP AL,'A'
  194.     JB  error
  195.     CMP AL,'F'
  196.     JBE sub37
  197.    
  198.     CMP AL,'a'
  199.     JB  error
  200.     CMP AL,'f'
  201.     JBE sub57
  202.  
  203. error:
  204.     Print   emsg,emsg_len
  205.     Exit
  206.  
  207. sub57:  SUB AL,20H
  208. sub37:  SUB AL,07H
  209. sub30:  SUB AL,30H
  210.    
  211.     ADD     BX,AX
  212.  
  213.     INC RSI
  214.     DEC RCX
  215.     JNZ next_byte
  216.        
  217. RET
  218. ;-------------------------------------------------------------------------------------
  219.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement