Assignment 6
Name: Bhise Gayatri Rajendra                                            Roll:308
Program
section .data
  msg1 db 10,10, '###### Menu for Code Conversion ######'
  db 10, '1: Hex to BCD'
  db 10, '2: BCD to Hex'
  db 10, '3: Exit'
  db 10,10, 'Enter Choice:'
  msg1length equ $-msg1
  msg2 db 10,10, 'Enter 4 digit hex number::'
  msg2length equ $-msg2
  msg3 db 10,10, 'BCD Equivalent:'
  msg3length equ $-msg3
  msg4 db 10,10, 'Enter 5 digit BCD number::'
  msg4length equ $-msg4
  msg5 db 10,10, 'Wrong Choice Entered....Please try again!!!', 10,10
  msg5length equ $-msg5
  msg6 db 10,10, 'Hex Equivalent::'
  msg6length equ $-msg6
  cnt db 0 ; counter for BCD digits
section .bss
  arr resb 6        ; Common buffer for choice, hex and BCD input
  dispbuff resb 8     ; Buffer for displaying results
  ans resb 1        ; Store single digit for display
%macro disp 2
  mov rax, 01
  mov rdi, 01
  mov rsi, %1
  mov rdx, %2
  syscall
%endmacro
%macro accept 2
  mov rax, 0
  mov rdi, 0
  mov rsi, %1
  mov rdx, %2
  syscall
%endmacro
section .text
  global _start
_start:
menu:
  disp msg1, msg1length
  accept arr, 2 ; Accept choice (1, 2, or 3)
  cmp byte [arr], '1'
  jne l1
  call hex2bcd_proc
  jmp menu
l1:
  cmp byte [arr], '2'
  jne l2
  call bcd2hex_proc
  jmp menu
l2:
  cmp byte [arr], '3'
  je exit
  disp msg5, msg5length
  jmp menu
exit:
  mov rax, 60
  mov rbx, 0
  syscall
hex2bcd_proc:
  disp msg2, msg2length
  accept arr, 5       ; 4 digits + enter
  call conversion      ; Convert Hex to BCD
  mov rcx, 0
  mov ax, bx
  mov bx, 10          ; Base 10 for Decimal system
  ; Divide the hex value by 10 to get BCD representation
l33:
  mov dx, 0
  div bx            ; Divide the number by 10
  push rdx           ; Push the remainder onto stack
  inc rcx
  inc byte [cnt]      ; Increment digit counter
  cmp ax, 0
  jne l33
  disp msg3, msg3length
l44:
  pop rdx            ; Pop the remainder from stack
  add dl, 30h         ; Convert to ASCII
  mov [ans], dl
  disp ans, 1      ; Display the digit
  dec byte [cnt]
  jnz l44
  ret
bcd2hex_proc:
  disp msg4, msg4length
  accept arr, 6     ; 5 digits + enter
  disp msg6, msg6length
  mov rsi, arr
  mov rcx, 5
  mov rax, 0
  mov ebx, 0ah       ; Base 10 for BCD
l55:
  mov rdx, 0
  mul ebx          ; ebx * eax = edx:eax
  mov dl, [rsi]
  sub dl, 30h      ; Convert ASCII to number (0-9)
  add rax, rdx
  inc rsi
  dec rcx
  jnz l55
  mov ebx, eax         ; Store the result in ebx
  call disp32_num        ; Display the result
  ret
conversion:
  mov bx, 0
  mov ecx, 4          ; 4 digits in hex input
  mov esi, arr
up1:
  rol bx, 4         ; Rotate left by 4 bits (1 hex digit per iteration)
  mov al, [esi]
  cmp al, 39h
  jbe l22
  sub al, 07h
l22:
  sub al, 30h         ; Convert ASCII to integer (0-9 or A-F)
  add bl, al
  inc esi
  loop up1
  ret
; Procedure to display a 32-bit number (result of BCD to Hex conversion)
disp32_num:
  mov rdi, dispbuff
  mov rcx, 8         ; Number of digits (since we are dealing with a 32-bit number)
l77:
  rol ebx, 4        ; Rotate left by 4 bits
  mov dl, bl
  and dl, 0fh
  add dl, 30h            ; Convert to ASCII
  cmp dl, 39h
  jbe l66
  add dl, 7         ; Adjust for 'A'-'F'
l66:
  mov [rdi], dl
  inc rdi
  dec rcx
  jnz l77
  disp dispbuff + 3, 5      ; Display only lower 5 digits (upper 3 are zeros)
  ret
output:
###### Menu for Code Conversion ######
1: Hex to BCD
2: BCD to Hex
3: Exit
Enter Choice:1
Enter 4 digit hex number::2345
BCD Equivalent:9029
###### Menu for Code Conversion ######
1: Hex to BCD
2: BCD to Hex
3: Exit
Enter Choice:2
Enter 5 digit BCD number::02345
Hex Equivalent::00929
[Execution complete with exit code 0]