如何在ASM中使用多个数字进行数学运算

时间:2017-05-21 09:05:04

标签: assembly x86

这是我现在的代码,但它只能做1位数字。这是为了课,我不知道如何让它做多个数字。我仍然是ASM编程的初学者,我想请求如何做多位数的帮助。

row full

1 个答案:

答案 0 :(得分:1)

如果您意识到计算机如何处理数字,这可能会有所帮助。

与人类不同,他们无法解决思想中的抽象实体,以及数字是什么。计算机需要一些物理表示,以便对其进行处理和处理。

但是人类会做类似的事情,如果我想告诉你一些关于1234号的事情,我会像那样写出#34; 1234",纸张/屏幕上的四个字体字形。这不再是实数,而是基数为10的格式"镜像"它,远非完美。你怎么读它并转换成1234值?你知道每个数字都是10的不同,你知道如何使用它们。

对于计算机使用相同的原理,但它们的原生基数为2,数字0/1可以很容易地编码为电线/单元中的电流/无电流,因此这样的单个0/1数字被称为&# 34;位&#34 ;.由于单个位只能存储两个值,因此我们倾向于将它们组合在一起,形成一个字节。现在,一个字节(8位)可以存储2个 8 个不同的值,这些值在被解释为无符号整数时将覆盖范围0..255。 16位可以涵盖从065535的值(或者不同,当您将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 0010printf创建自己的完整+正确替代品已经有几个星期了,我甚至都不谈论效率。但只要您只需要一些基本的整数转换来学习和玩弄,它就可以在一天之内完成。只要意识到什么是什么,并注意各种类型的值如何在计算机内编码成位(以及它们中的多少)。然后可以使用简单的数学公式将一种表示转换为另一种表示。

顺便说一句,有方法(公式),即使使用单独的数字也可以完成所有算术运算(即使用"字符串"进行计算)。这甚至有时是实用的,一些"任意精度"库使用类似的原理来计算不适合本机8/16/32/64/128位值的值。所以上面的答案应该更像是" unlocker"给你一个想法,你掌握了什么,你可以做任何你想要的转换/计算,当你理解什么是什么,以及它在CPU内如何工作。它不是唯一可能的方式,如何使用价值观。