![64位汇编语言的编程艺术](https://wfqqreader-1252317822.image.myqcloud.com/cover/1/51906001/b_51906001.jpg)
2.3 关于数字与表示的注释
人们常常混淆了数字及其表示的概念。刚刚开始学习汇编语言的学生通常会提出这样一个疑问:“在EAX寄存器中有一个二进制数,如何将其转换为EAX寄存器中的十六进制数呢?”答案是:“不需要转换。”
尽管可以提出一个强有力的论点,即内存或寄存器中的数是用二进制表示的,但最好将内存或寄存器中的值视为抽象的数字量(abstract numeric quantity)。128、80h或10000000b等符号串并不是不同的数字,它们只是同一抽象数字量的不同表示,我们称该量为一百二十八。在计算机内部,数字就是一个数字,与其表示形式无关,仅当以人类可阅读的形式输入或输出值时,才会区分该值的表示形式。
数字量可供人类阅读的形式总是字符串。为了以人类可阅读的形式打印值128,必须将其转换为三字符序列“128”,这将提供数字量的十进制表示形式。如果需要,也可以将值128转换为三字符序列“80h”。这里跟“128”表示的是一个相同的值,但我们将其转换为不同的字符序列,因为(大概)我们希望使用十六进制表示法而不是十进制表示法来查看数值。同样,如果我们希望查看数值对应的二进制表示,就必须将这个数值转换成一个包含1个1和7个0的字符串。
纯汇编语言没有通用的打印或者输出函数,可以调用打印或输出函数在控制台上将数字量显示为字符串。我们可以编写自定义的过程来处理这个显示过程(本书稍后将讨论其中的一些过程)。目前,本书中的MASM代码依赖于C标准库的printf()函数来显示数值。请阅读程序清单2-1中的程序,该程序将各种数值转换为其等价的十六进制数值。
程序清单2-1 十进制数到十六进制数的转换程序
![](https://epubservercos.yuewen.com/6EAC66/30664241903216506/epubprivate/OEBPS/Images/120.jpg?sign=1738867190-NiVeU13astd5J7rz40R4bBlxlDiyqEii-0-9712b3ed6a847336a94c02f1028cdc0d)
![](https://epubservercos.yuewen.com/6EAC66/30664241903216506/epubprivate/OEBPS/Images/121.jpg?sign=1738867190-RXQHXShRot4zs7KSUzOqI8r3WZ7Axeuc-0-451389a17b9d65cb6af6670bbb306916)
![](https://epubservercos.yuewen.com/6EAC66/30664241903216506/epubprivate/OEBPS/Images/122.jpg?sign=1738867190-1JpyZmz3HysQMfXqaUfhgmWJAwyrKqEO-0-23e6a28c7d47458544a3749fa85333f9)
程序清单2-1使用了第1章中的c.cpp通用程序(以及build.bat通用批处理文件)。在命令行中,可以使用以下命令编译和运行这个程序:
C:\>build listing2-1
C:\>echo off
Assembling:listing2-1.asm
c.cpp
C:\>listing2-1
Calling Listing 2-1:
i=1,converted to hex=1
j=123,converted to hex=7b
k=456789,converted to hex=6f855
Listing 2-1 terminated