将二进制转换为十进制并在程序集中显示

时间:2012-01-31 12:16:41

标签: assembly binary decimal x86-16

我有一个单词数组,有4个单元格

RESULT DW 4 DUP(0)

它将包含二进制数,例如

MOV RESULT,   0H
MOV RESULT+2, 0H
MOV RESULT+4, 35A4H
MOV RESULT+6, E900H

现在结果包含0000000035A4E900H,这意味着以十进制方式 900000000 。 不是我想在显示器上打印 900000000

我该怎么办?

1 个答案:

答案 0 :(得分:5)

无论您使用何种语言转换为十进制以十进制打印都是相同的过程。两个过程中的一个。你可以从任何一端开始。假设您有一个16位数字12345(0x3039)。

第一种方式是

divide by 10000 result is 1 remainder 2345 save or print the 1
divide by 1000 result is 2 remainder 345 save or print the 2
divide by 100 result is 3 remainder 45 save or print the 3
divide by 10 result is 4 remainder 5 save or print the 4 and 5

第二种方式

divide by 10 result is 1234 remainder 5 save the remainder use the result
divide by 10 result is 123 remainder 4 save the remainder use the result
divide by 10 result is 12 remainder 3 save the remainder use the result
divide by 10 result is 1 remainder 2 save both the remainder and result 
print the results in the right order

现在,如果你的问题是如何用我的指令集将64位数除以这些10的幂,有时你可以,有时你不能,有时你必须使用其他数学规则。除以10与除以2 * 5相同,因此可以除以2(移位)然后除以5。

0x3039(12345)除以10000与右移4相同,然后除以5得到功率4(625)。 0x303 = 771,771 / 632 = 1.如果你的除数不大,你的乘法可能不是这样1 * 625 = 0x271,0x271<< 4 = 0x2710,0x3039 - 0x2710 = 0x929 = 2345.一旦你得到一个数字,你可以用硬件划分然后使用硬件。

你可能需要除以中间的一个数字,比如你有一个32位数字(最大4,294,967,296),你有硬件可以从32位数字分成16位结果和16位余数。您可以使用上述方法关闭几个数字,然后离开94,967,295,然后除以10000得到9496余数7295然后使用硬件独立地处理这四位数。

如果你没有分区硬件但是多硬件(是的,我知道你指定了8086)你可以这样做:

http://www.divms.uiowa.edu/~jones/bcd/divide.html

如果你从小学那里记得如何在铅笔和纸上多次使用:

    1234
   x1010 
   =====
    0000  
   1234   
  0000
+1234 
========
 1246340

二进制文件非常简单,因为您可能会根据我选择的数字进行描述

  abcd
x efgh
====== 

如果你想将4位abcd乘以4位,那么:

result = 0;
if(h) result+=abcd << 0;
if(g) result+=abcd << 1;
if(f) result+=abcd << 2;
if(e) result+=abcd << 3;

对于大多数指令集,您可以将多个指令级联为与内存一样宽,希望将100万位乘以1百万位。没问题,500,000字节加一点或多个寄存器(以及很多时钟周期)。