Hex to BCD, BCD to Hex conversion (Assembly x86)
section .data msg db 10,13,”Enter Hex number (max. FFFFH)”, 10 msglen equ $-msg msg2 db 10,13,”The converted BCD number is:”, 10 msglen2 equ $-msg2 nwline db 10 nwlen equ $-nwline msg3 db 10,13,”Enter BCD number: (Note: Enter 5 digit. E.g. 00018)”, 10 msglen3 equ $-msg3 msg4 db 10,”Choose one of the following:”, 10, “(1)Hex to BCD”, 10, “(2)BCD to Hex”, 10, “(3)Exit”, 10 msglen4 equ $-msg4 msg5 db 10,”The converted Hex number is:”, 10 msglen5 equ $-msg5 section .bss cnt resb 1 num resb 5 num1 resb 1 num2 resb 6 numbuff resb 5 num3 resb 4 opt resb 1 %macro disp 2 mov eax,4 mov ebx,1 mov ecx,%1 mov edx,%2 int 80h %endmacro %macro accept 2 mov eax,3 mov ebx,0 mov ecx,%1 mov edx,%2 int 80h %endmacro section .text global _start _start: ;–MENU– disp msg4, msglen4 accept opt, 2 sub byte[opt], 30h ;mov eax, [opt] cmp byte[opt], 01h jz hextobcd cmp byte[opt], 02h jz bcdtohex cmp byte[opt], 03h jz exit ;–Hex to BCD– hextobcd: disp msg, msglen accept num, 5 call ascii_to_original mov eax, 0 mov eax, ebx mov cx, 10 mov byte[cnt], 00h l1: mov edx, 0 div cx push dx ;Pushing Remainder inc byte[cnt] cmp ax, 0 jnz l1 disp msg2, msglen2 l6: pop dx add dl, 30h mov [num1], dl disp num1, 1 dec byte[cnt] jnz l6 disp nwline, nwlen jmp _start ;–BCD to Hex– bcdtohex: disp msg3, msglen3 accept num2, 6 mov esi, num2 mov eax, 0 ;clear since it is used by default by mul instruction mov ebx, 10 ;since we multiply 10 according to places. E.g. unit place -> *1 ten’s place -> *10 etc. and we add mov ecx, 05 ;5 digit number max. (65,535) l5: mov edx, 0 ;before multiplication, initialize mul ebx mov edx, 0 ;To clear higher bytes since we are doing operaiton on dl mov dl, [esi] sub dl, 30h add eax, edx inc esi dec ecx jnz l5 mov [numbuff], eax disp msg5, msglen5 call original_to_ascii disp nwline, nwlen jmp _start ;Example: 18 BCD to 12h Hex ;8*1 = 08 = 0000 1000 ; + ;1*10= 0A = 0000 1010 ; ———– ; 0001 0010 ;For 18, it will be stored as: [30][30][30][31][38] ;Step by Step execution: ; (1) eax = 0 dl = 0 ; eax = 0 ; (2), (3) same as above since 0 (30) ; (4) eax = 0 dl = 01 ; eax = 01 ; (5) eax = 10 (i.e. 0A) dl = 08 ; eax = 12 (i.e. 00C0) ;–Exit– exit: mov eax, 1 mov ebx, 0 int 80h ;–ASCII to Original– ascii_to_original: mov edi,num mov ecx,2 mov bx,0 l2: rol bx,4 mov al,[edi] cmp al,39h jbe l3 sub al,07h l3: sub al,30h mov ah,0h add bx,ax inc edi loop l2 ret ;–Original to ASCII– original_to_ascii: disp nwline, nwlen mov edi, numbuff mov bx, [edi] mov ecx, 5 mov esi, num3 l7: rol bx, 4 mov dl, bl and dl, 0fh cmp dl, 09h jbe l8 add dl, 07h l8: add dl, 30h mov [esi], dl inc esi loop l7 disp num3, 4 ret