十进制、十六进制、bcd互转

//输出: 
// 
//返回:int  rslt                        转换后的十进制数据 
// 
//思路:十六进制每个字符位所表示的十进制数的范围是0 ~255,进制为256 
//      左移8位(<<8)等价乘以256 
// 

unsigned long HextoDec(const unsigned char *hex, int length) 

    int i; 
    unsigned long rslt = 0; 
    for(i=0; i<length; i++) 
    { 
        rslt += (unsigned long)(hex[i])<<(8*(length-1-i)); 
                                                         
    } 
    return rslt; 


// 
//功能:十进制转十六进制 
// 
//输入:int dec                     待转换的十进制数据 
//      int length                  转换后的十六进制数据长度 
// 
//输出:unsigned char *hex          转换后的十六进制数据 
// 
//返回:0    success 
// 
//思路:原理同十六进制转十进制 
// 
int DectoHex(int dec, unsigned char *hex, int length) 

    int i; 
    for(i=length-1; i>=0; i--) 
    { 
        hex[i] = (dec%256)&0xFF; 
        dec /= 256; 
    } 
    return 0; 


// 
//功能:求权 
// 
//输入:int base                    进制基数 
//      int times                   权级数 
// 
//输出: 
// 
//返回:unsigned long               当前数据位的权 
// 
// 
unsigned long power(int base, int times) 

    int i; 
    unsigned long rslt = 1; 
    for(i=0; i<times; i++) 
        rslt *= base; 
    return rslt; 


// 
//功能:BCD转10进制 
// 
//输入:const unsigned char *bcd     待转换的BCD码 
//      int length                   BCD码数据长度 
// 
//输出: 
// 
//返回:unsigned long               当前数据位的权 
// 
//思路:压缩BCD码一个字符所表示的十进制数据范围为0 ~ 99,进制为100 
//      先求每个字符所表示的十进制值,然后乘以权 
// 
unsigned long  BCDtoDec(const unsigned char *bcd, int length) 

     int i, tmp; 
     unsigned long dec = 0; 
     for(i=0; i<length; i++) 
     { 
        tmp = ((bcd[i]>>4)&0x0F)*10 + (bcd[i]&0x0F);    
        dec += tmp * power(100, length-1-i);           
     } 
     return dec; 


// 
//功能:十进制转BCD码 
// 
//输入:int Dec                      待转换的十进制数据 
//      int length                   BCD码数据长度 
// 
//输出:unsigned char *Bcd           转换后的BCD码 
// 
//返回:0  success 
// 
//思路:原理同BCD码转十进制 
// 
// 
int DectoBCD(int Dec, unsigned char *Bcd, int length) 

     int i; 
     int temp; 
     for(i=length-1; i>=0; i--) 
     { 
         temp = Dec%100; 
         Bcd[i] = ((temp/10)<<4) + ((temp%10) & 0x0F); 
         Dec /= 100; 
     } 
     return 0; 

int main() 

    register int i; 
    unsigned char tmp_bff[12] = ""; 
    //十六进制转十进制 
    unsigned char HEX[4] = {0x34, 0xFE, 0x3E, 0xFF}; 
    unsigned long dec_hex = 0; 
    dec_hex = HextoDec(HEX, 4); 
     
    printf("dec_hex = %d\n", dec_hex); 
    //十进制转十六进制 
    DectoHex(dec_hex, tmp_bff, 4); 
    for(i=0; i<5; i++) 
    { 
        printf("tmp_bff[%d] = 0x%02X\n",i, tmp_bff[i]); 
    } 
    //BCD码转十进制 
    unsigned long dec_bcd = 0; 
    unsigned char BCD[4] = {0x98, 0x23, 0x45, 0x78}; 
    dec_bcd = BCDtoDec(BCD, 4); 
    printf("dec_bcd = %d\n", dec_bcd); 
    //十进制转BCD码 
    DectoBCD(dec_bcd, tmp_bff, 4); 
    for(i=0; i<5; i++) 
    { 
        printf("tmp_bff[%d] = 0x%02X\n", i, tmp_bff[i]); 
    } 
    getchar(); 

BCD

 

 


void BCDToChar(const unsigned char *src,unsigned int srcLen, unsigned char *dest)
{
    unsigned char temp[2] = {0};
    unsigned char temp2[1] = {0};
    for(int i=0; i<srcLen; i++)
    {
       temp2[0] = src[i];
       temp[0] = src[i]>>4;
       temp[0] = temp[0]&0x0F;
       temp[0] = temp[0]+0x30;
       temp[1] = temp2[0]&0x0F;
       temp[1] = temp[1]+0x30;
       dest[i*2] = temp[0];
       dest[i*2+1] = temp[1];
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是针对您的实验要求的指导: 1. 更改十六进制BCD实验: 在emu8086软件中进行十六进制BCD的实验,可以参考以下步骤: - 首先打开emu8086软件,创建一个新的程序文件 - 在程序中定义需要转换的十六进制数值 - 将十六进制数值转换成二进制数值 - 将二进制数值分成4位一组,分别转换成BCD码 - 将BCD码合并起来,得到最终的BCD码 以下是一个简单的十六进制BCD的示例程序,供您参考: ``` org 100h mov al, 0A7h ; 设置需要转换的十六进制数值 mov bl, 10 ; 设置除数,用于将二进制数值分组 mov cl, 4 ; 设置每组的位数,即BCD码的位数 mov ah, 0 ; 清空寄存器 mov bh, 0 ; 清空寄存器 convert: xor ah, ah ; 清空寄存器 div bl ; 将al除以bl,商存入ah,余数存入al or ah, 30h ; 将ah转换为ASCII码 cmp ah, 39h ; 判断是否大于9 jbe skip ; 如果不大于9,跳过下一行 add ah, 7h ; 如果大于9,加上7,得到对应的字母 skip: push ax ; 将ah和al压入栈中 inc bh ; 增加计数器 cmp bh, cl ; 判断是否已经达到每组的位数 jne convert ; 如果没有达到,继续转换 pop ax ; 弹出栈中的数据,得到最后一个BCD码 mov dl, al ; 将最后一个BCD码存入dl pop ax ; 弹出栈中的数据,得到前一个BCD码 mov dh, al ; 将前一个BCD码存入dh mov ah, 2 ; 设置输出功能号 mov dl, dh ; 输出高位BCD码 int 21h ; 调用21h中断 mov dl, dl ; 空一格 int 21h ; 调用21h中断 mov ah, 2 ; 设置输出功能号 mov dl, dl ; 空一格 int 21h ; 调用21h中断 mov dl, dl ; 空一格 int 21h ; 调用21h中断 mov ah, 2 ; 设置输出功能号 mov dl, dl ; 空一格 int 21h ; 调用21h中断 mov dl, dl ; 空一格 int 21h ; 调用21h中断 mov ah, 2 ; 设置输出功能号 mov dl, dl ; 空一格 int 21h ; 调用21h中断 mov dl, dl ; 空一格 int 21h ; 调用21h中断 mov ah, 4ch ; 设置退出功能号 int 21h ; 调用21h中断 ``` 2. 实现二进制转十进制: 在emu8086软件中实现二进制转十进制的实验,可以参考以下步骤: - 首先打开emu8086软件,创建一个新的程序文件 - 在程序中定义需要转换的二进制数值 - 设定计数器,用于计算二进制数值的十进制值 - 用除法算法将二进制数值转换成十进制数值 以下是一个简单的二进制转十进制的示例程序,供您参考: ``` org 100h mov al, 1010110b ; 设置需要转换的二进制数值 mov bl, 10 ; 设置除数,用于将二进制数值转换成十进制数值 mov cl, 0 ; 清空计数器 mov dl, 0 ; 清空寄存器 convert: xor ah, ah ; 清空寄存器 div bl ; 将al除以bl,商存入ah,余数存入al mov bh, ah ; 将ah存入bh shl bh, cl ; 将bh左移cl位 or dl, bh ; 将dl和bh进行或运算 inc cl ; 增加计数器 cmp al, 0 ; 判断是否已经将所有位数转换完 jne convert ; 如果没有转换完,继续转换 mov ah, 0 ; 设置输出功能号 mov al, dl ; 将十进制数值存入al add al, 30h ; 将al转换为ASCII码 mov dl, al ; 将al存入dl mov ah, 2 ; 设置输出功能号 int 21h ; 调用21h中断 mov ah, 4ch ; 设置退出功能号 int 21h ; 调用21h中断 ``` 希望这些内容能够对您有所帮助。如有任何问题,请随时联系我。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值