注册 登录
编程论坛 汇编论坛

用汇编语言把二进制转换为十进制

蓝然籽 发布于 2015-04-28 18:31, 15858 次点击
二进制转化为十进制用除法,就是除以100,然后除以10。假设43H是入口,出口是44H,45H,如果用44H的低四位存放十进制的百位,用45H的高四位和低四位分别存放十进制的十位和个位,应该怎么把分离出来的数分别存进高四位和低四位,应该用什么指令?分离出来的数放在A里面时,是占的高位还是低位?刚学汇编,求指导……
13 回复
#2
hu9jj2015-04-28 22:33
通常数据是以二进制的方式储存的,显示或打印时才根据需要转换成其他制式。你如果想以十进制的方式来保存数据,存放的格式完全由你自行决定,没有什么标准。
#3
xumengxue2015-04-29 15:33
这个问题我朋友懂
#4
hu9jj2015-04-29 16:50
以下是引用xumengxue在2015-4-29 15:33:53的发言:

这个问题我朋友懂
涉嫌灌水
#5
蓝然籽2015-04-29 20:39
回复 2楼 hu9jj
恩,就是为了显示出数字,才用的十进制,现在已经弄出来了~
#6
取名字2015-04-30 12:57
    二进制转化为十进制,照楼主说的先除以100,再除以10,那只能用于已知被转化数为多少的情况,如果不知道被转化数为多少的话,这种方法就不适用了,应该用被转化数不断的除以10,将每次的余数存储起来(每次的余数就是被转化数各个数位上的值,第一次除以10得到的余数是个位上的,第二次除以10得到的余数是十位上的,依此类推),直到商为0说明除完了。但因为这样先得到的是个位上被分离出来的数字,所以数字分离的顺序就是个位、十位、百位……,我们可以利用栈将这个顺序理顺:将每次得到的余数依次入栈,完成之后再依次出栈。利用这种方法,要注意当被转化数较大时可能发生除法溢出,这种情况的解决办法在王爽老师《汇编语言》一书中有提到。
    用上述方法分离出来的数字按题目要求存储的话可以按如下操作:
    xor ax,ax            ;ax清零,以暂存分离出来的个位和十位上的数字
    mov al,个位
    mov ah,十位
    mov cl,4            ;cl中为移位的位数
    shl ah,cl
    or  al,ah            ;将ah中存储的十位上的数字与al中存储的个位上的数字合并到一块,
    mov [45h],al         ;按要求存储到指定内存单元,执行后,45h字节单元的低4位就是分离出来的个位上的数字,45h单元的高4位就是分离出来的十位上的数字
    mov al,百位
    mov [44h],al         ;将分离出来的百位上的数字存储到44h字节单元
   
    数据在内存单元中存储时都是从低位到高位的。

[ 本帖最后由 取名字 于 2015-4-30 12:58 编辑 ]
#7
取名字2015-05-01 07:48
以下是引用边小白在2015-5-1 06:51:12的发言:

这行吗?验证没有?
我正在努力学汇编,正努力理解二进制十进制呢,楼主的意思是不是将FF用255表示出来呢?
1、行,我编过这道程序,并在DEBUG里单步跟踪过;
2、对,就是这个意思。
#8
取名字2015-05-02 00:13
    个、十、百位指的是十进制数的数位。十进制数字在计算机中是以二进制形式存储的,如十进制数字12,在计算机中的表示就是(以字节为例)0000 1100B,十六进制表示就是0CH,现在我们要把这种计算机中的表示转化成十进制表示形式,即表示成0001 0010B,十六进制就是12h。前面所讲个、十、百位是指转换过程中分离出来的数位值。下面是具体的示例:
    ……
    mov    ax,0C            ;要转化的数字
    mov    bl,0A            ;10作为除数存储在寄存器bl中
    div    bl               ;ax中的数值作为被除数除以bl中存放的除数10,商1(即分离出来的十位上的数字)存放在al中,余数2(即分离出来的个位上的数字)存放在
                            ;ah中            
    mov    cl,4
    shl    al,cl
    mov    [45],al         ;以上3步将存放在al中的商(分离出来的十位上的数字)左移4位,以便存放在[45h]单元的高4位
    or     [45],ah         ;将存放在ah中的余数(分离出来的个位上的数字)存放入[45h]单元的低4位
    ……
    以上代码中的内存寻址采用的是立即寻址,没有段前缀,只能在DEBUG环境下使用,并且DEBUG环境下默认都是十六进制,所以十六进制数45后面不需要加H。

[ 本帖最后由 取名字 于 2015-5-2 15:55 编辑 ]
#9
wmf20142015-05-02 05:49
按楼主的意思,完成该功能的代码如下:
xor ah,ah
mov bl,10
mov cl,4
mov al,[43h]  //从入口获取需要变换的数字
div bl
mov [45h],ah  //得到个位,放到位置45的低4位
xor ah,ah
div bl
shl ah,cl
or [45h],ah  //得到十位,放到45的高4位
mov [44h],al  //al中是余下的百位,放到44处
int 3         //完成,在debug中验证通过。如果写通用的函数,建议不使用高位低位,应使用si指向二进制数,di指向变换后存储的位置(开始为反序存储,需执行一次反序操作)

#10
取名字2015-05-02 08:18
还是wmf2014版主周到仔细!
#11
取名字2015-05-02 15:51
    你在DEBUG中,把[45H]、[44H]后面的H去掉了吗,因为在DEBUG环境下默认就是十六进制的,不能加H,因为你加了H,DEBUG会认为这也是一个十六进制字符,但十六进制中并没有这个字符,所以会报错。另外“mov bl,10”这条指令是将数字10传送入bl寄存器,但在DEBUG环境下,应该输入10的十六进制表示0A。
    再还有在DEBUG环境下输入汇编代码,要用a命令。

[ 本帖最后由 取名字 于 2015-5-2 15:53 编辑 ]
#12
蓝然籽2015-05-06 09:21
回复 6楼 取名字
恩……看起来好有道理,抱歉啊,那么长时间才看,我试试程序……谢谢~
#13
忙郎2016-01-29 10:27
move bl,10 应该写成0ah
#14
Alexanders2016-11-24 08:58
回复 6楼 取名字
大神,大神。怎么把四进制转换成十进制啊
1