2

我用java编程了很多,知道python的基础知识,有时我玩c++......这些都是高级编程语言,它们很棒,但我很好奇事情在这个更深层次上是如何工作的case 汇编语言... 我开始学习 x86 处理器的汇编并选择 NASM 作为我的汇编程序。我花了一些时间学习寄存器和堆栈是如何工作的,如何存储信息以及如何更改信息,不仅仅是阅读,而是练习,使用调试器等等,有些事情真的开始困扰我:数值操作......

我的意思是,每当从输入中读取某些内容时,它都会作为对应的 ASCII 值存储在内存中,我可以接受...我了解如何使用整个通道偏移和长度读取和写入控制台的基础知识系统但是正如我之前提到的,包括数字在内的字符存储为 ASCII 值。0 存储为 0x30,1 存储为 0x31,等等。这意味着单个数字存储为整个字节,我认为这是一个缺点,因为我知道一个字节可以表示高达 255 的数字,这将节省大量内存和时间来进行数学运算并为其他数据留出空间......在像 c++ 这样的语言中,整数值仅由 4 个字节表示,这意味着这些语言可以存储最多 4294967295 的整数

言归正传...我真正想知道的是什么是表示数字并使用 nasm 进行基本算术运算的最佳方法。我应该将这些数字保留为 ASCII 值并在字节级别上进行操作还是应该转换这些数字,以便一个字节可以容纳更大的值?或者有没有办法更有效地读取数字?

PS.:对不起,很长的帖子,我只是想提供我所关注的整体背景,以便你们可以根据它来帮助我......对于糟糕的英语......我试图尽可能清楚(英语不是我的母语,但我会尽可能多地理解它......在我编程时了解英语很有帮助)

4

4 回答 4

0

首先,你不能......我再说一遍,你不能将汇编与任何高级语言进行比较!它们存储数据和与数据交互的方式完全不同。他们这样做是为了让程序员的生活更轻松。如果要将 char 的 ASCII 码存储为 DWORD,请继续。

在组装中,绝对没有手牵手。CPU 不知道您想对任何数据做什么,无论是文件中的字节还是键盘上输入的字符。

您在大会中自己做所有事情。您在键盘上按下的字符是 ASCII 字符,因为这是在您键入它们时显示的,如果您想对它们做其他事情,程序员可以根据需要对其进行转换。

将 ASCII 数字转换为数字是微不足道的。

Numbers: 0  1  2  3  4  5  6  7  8  9
ASCII:   48 49 50 51 52 53 54 55 56 57

看到它们之间的区别了吗?48是神奇的数字。

你遍历你的字符串,测试每个数字是否在 48 到 57 之间,其他的都跳过。如果 ASCII 字符介于 48 和 57 之间,则从字符中减去 48 即可得到一个数字。您添加 48 以获得数字的 ASCII 字符。

不告诉您使用 atodw/atoi 或其他什么,您可以通过自己了解更多信息,这并不难。

于 2012-11-28T01:36:10.970 回答
0

我会从ASCII转换。它使一切变得更简单,想象一下将 ascii 数字相乘。如果你有多个使用 ascii 的数字可能会变得非常烦人。此外,您可以声明超过一个字节的变量:

b=字节

w=字(2字节)

dw=双字(4字节)

var1 w   0000h ;
var2 dw   0007h
var3 b 0000h

这样您就可以从控制台获取输入。只需一位数:

mov ah, 1  ;int 21h (interrupt 21h) in the next line is a function that can do many things
int 21h    ;depending on the value you put in register "ah". Using 1 it reads input the value is stored in "al"
add al, -48 ;ascii -> bin .. here you substract 48 to transform from ASCII
mov [var1],al

你可以像这样添加两个数字(负数需要额外的东西)你会得到

[变量1]=[变量1]+[变量2]

mov al,[var2]
add al, [var1]
mov [var1],al

CPU通常也有乘法指令

看看这个,它是 8086 处理器的指令集,这是你可以告诉它做的所有事情。 8086指令集

于 2012-11-28T01:16:51.313 回答
0

与任何语言一样:如果您有一个字符串,但您想对其进行数字运算,请将其转换为数字。除非它不适合您的处理器的任何通用寄存器。

我现在不知道您的目标是什么指令集,但是例如。在 x86-64 中,有 8 位、16 位、32 位和 64 位通用寄存器来保存您的数字。如果您的数字不适合 64 位(在 x86-64 中),那么事情会变得有点复杂。如果您想要目标架构中可用的最大范围的数字,最好的方法是将数字存储在尽可能大的寄存器或内存中。

与高级语言相比,在汇编级别中,有符号变量和无符号变量之间没有区别,它只取决于您如何处理它。但是有有符号和无符号运算,例如有符号乘法 ( imul)、有符号除法 ( idiv)、无符号乘法 ( mul)、无符号除法 ( div)。

于 2012-11-28T01:17:06.570 回答
-2

Ascii 字符不是数字。

您需要使用atoi功能。

于 2012-11-28T01:17:19.113 回答