; ------------------------------------------------------------ ; rutina y ejemplo para convertir binario a bcd empaquetado o ; bcd empaquetado a binario ; ------------------------------------------------------------ org 100h mov num[0],123fh ; parte baja del doble word mov num[2],3A3h ; parte alta del doble word call bin2bcd mov bcd[0],23h ; byte menos significativo del bcd empaquetado mov bcd[1],45h mov bcd[2],67h mov bcd[3],89h ; byte mas significativo del bcd empaquetado call bcd2bin ret ; ------------------------------------------------------------ ; bcd a binario ; entrada -> bcd empaquetado de 8 digitos en el vector bcd ; salida -> binario en doble word variable num ; ------------------------------------------------------------ bcd2bin:mov num[0],0 ; borra variable destino mov num[2],0 mov cx,32 bc2b_o1: push cx shr bcd[3],1 ; rotar un bit a la derecha rcr bcd[2],1 rcr bcd[1],1 rcr bcd[0],1 rcr num[2],1 rcr num[0],1 mov bx,0 mov cx,4 bc2b_o: ; verifica cada nibble de cada bytes en la cadena bcd ; si es mayor o igual a 8 en ese caso le resta 3 mov al,bcd[bx] test al,08h jz bc2b_s1 sbb bcd[bx],03h ; si es mayor igual a 8 le resta 3 bc2b_s1:test al,80h jz bc2b_s2 sbb bcd[bx],30h ; si es mayor igual a 8 le resta 3 bc2b_s2:inc bx ; incrementa bx para verificar el proximo byte loop bc2b_o ; loop para barrer todos los bytes pop cx loop bc2b_o1 ret ; ------------------------------------------------------------ ; binario a bcd ; entrada -> binario en doble word variable num ; salida -> bcd empaquetado de 8 digitos en el vector bcd ; ------------------------------------------------------------ bin2bcd:mov bcd[0],0 ; borra variable destino mov bcd[1],0 mov bcd[2],0 mov bcd[3],0 mov cx,32 bi2b_o1:push cx mov bx,0 mov cx,4 bi2b_o: ; verifica cada nibble de cada bytes en la cadena bcd ; si es mayor a 5 en ese caso le suma 3 mov al,bcd[bx] and al,0f0h cmp al,50h ; verificar si el nibble mas significativo es mayor o igual a 5 jb bi2b_s1 add bcd[bx],30h ; si es mayor a 5 le suma 3 bi2b_s1:mov al,bcd[bx] and al,00fh cmp al,05h ; verificar si el nibble menos significativo es mayor o igual a 5 jb bi2b_s2 add bcd[bx],03h ; si es mayor a 5 le suma 3 bi2b_s2:inc bx ; incrementa bx para verificar el proximo byte loop bi2b_o ; loop para barrer todos los bytes ; rcl num[0],1 ; rotar el numero 1 bit a la izquierda rcl num[2],1 rcl bcd[0],1 ; desplazamos toda la cadena un bit a la izquierda rcl bcd[1],1 ; insertando el acarreo anterior en el bit menos significativo rcl bcd[2],1 rcl bcd[3],1 pop cx loop bi2b_o1 ret ; ------------------------------------------------------------ num dd 0 bcd db 4 dup(0) ; num dd 23456780 ; bcd db 4 dup(0) ; num dd 0 ; bcd db 23h,45h,67h,80h