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 十进制数到十六进制数的转换程序
程序清单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