这是我现在的代码,但它只能做1位数字。这是为了课,我不知道如何让它做多个数字。我仍然是ASM编程的初学者,我想请求如何做多位数的帮助。
row full
答案 0 :(得分:1)
如果您意识到计算机如何处理数字,这可能会有所帮助。
与人类不同,他们无法解决思想中的抽象实体,以及数字是什么。计算机需要一些物理表示,以便对其进行处理和处理。
但是人类会做类似的事情,如果我想告诉你一些关于1234号的事情,我会像那样写出#34; 1234",纸张/屏幕上的四个字体字形。这不再是实数,而是基数为10的格式"镜像"它,远非完美。你怎么读它并转换成1234值?你知道每个数字都是10的不同,你知道如何使用它们。
对于计算机使用相同的原理,但它们的原生基数为2,数字0/1可以很容易地编码为电线/单元中的电流/无电流,因此这样的单个0/1数字被称为&# 34;位&#34 ;.由于单个位只能存储两个值,因此我们倾向于将它们组合在一起,形成一个字节。现在,一个字节(8位)可以存储2个 8 个不同的值,这些值在被解释为无符号整数时将覆盖范围0..255
。 16位可以涵盖从0
到65535
的值(或者不同,当您将16位的值解释为不同时,例如,最高位被解释为符号值,您可以覆盖{{{{1}的整数值1}})。
请注意,16位不具有任何信息,它们存储的值是什么,以及如何解释它们。它们只是十六个0/1值的组合,以及你如何解释它们(无符号,有符号,单独的位标志,甚至低精度浮点数,或者只是屏幕上的颜色或声音频率......),它是'直到[你的]代码以某种方式解释该值。
8086寄存器为16位,因此当您想使用-32768..+32767
等本机算术指令时,需要先将值编码为8/16位。
在用户输入时,您通常会有单独的ASCII字符。
所以当用户输入" number" ADD, SUB, MUL, DIV
,您经常会收到5个字节的值:49,50,51,52,13(最后13个是"输入"键)。现在尝试运行以下算法:
1234
在第一次循环后,bx将为1(49-48 + 0)
在第二次循环后,bx将为12(50-48 + 1 * 10)
在第三循环之后,bx将是123(51-48 + 12 * 10)
在第四循环之后,bx将是1234(52-48 + 123 * 10)
然后while条件将检测到enter,并跳过计算,并且在bx中,您有值1234二进制编码为16位(即电流在单元格中:bx = 0, si = address to first input
while ([si] != 13) { // until enter is detected
ax = 10
mul bx ; 32bit "dx:ax" = bx*10
bh = 0, bl = [si++]
bl -= '0' ; '0' = 48
bx = bx + ax
}
)。
这是可能性之一,如何将单独的数字字符转换为本机二进制值。
然后要显示结果,您将进行反向转换,将原生二进制值拆分为特定幂为10的数字,将其转换为ASCII字符,然后将它们输出到screen / file /等。
所有这些通常都可以在任何高级编程语言中轻松获得,但在ASM中很少(一些初学者友好的平台提供此作为OS调用的一部分,但DOS不是其中之一)。
也就是说,要为clib 0000 0100 1101 0010
和printf
创建自己的完整+正确替代品已经有几个星期了,我甚至都不谈论效率。但只要您只需要一些基本的整数转换来学习和玩弄,它就可以在一天之内完成。只要意识到什么是什么,并注意各种类型的值如何在计算机内编码成位(以及它们中的多少)。然后可以使用简单的数学公式将一种表示转换为另一种表示。