《汇编程序设计与计算机体系结构:软件工程师教程》 —3.2.2 字面量
3.2.2 字面量
字面量(literal value,字面值)也叫作立即值(immediate,立即数),用来表示那些由开发者明确指定的值,例如整数、实数、字符、字符串等。比方说,下面这行代码会把 5 这个字面值与 32 位寄存器 eax 的当前值相加,并将结果放入该寄存器。
编程知识:立即值用在那种开发者已经提前知道指令里该用什么值的场合。很多程序都依赖于用户所输入的数据,但除此之外,可能还会用到一些固定的值。比方说,要编写一个简单的程序把体重从磅换算为公斤。这个程序一方面要从用户那里获得以磅为单位的体重数据,另一方面则要将该数据与换算系数相乘(也就是乘以 0.45)将其转为以公斤为单位的结果。该程序所用到的这个换算系数就可以用字面量来表示。
整数字面量(integer literal)一般写为十进制(或者说以 10 为底的进制)的整数。在有些情况下也可以(甚至是必须)采用其他进制来写。MASM 及 NASM允许开发者在字面量之后写上一个表示基数的字符,以指出这个字面量所采用的进制。表 3-9 列出了这些字符。
表 3-9 MASM/NASM 所支持的基数字符,用来指出整数所采用的进制
下面这个例子演示了怎样用 MASM 及 NASM 所支持的这几种基数字符来表示十进制的 31。
MASM/NASM
有一种情况要注意,十六进制数的数位中可能会出现 A 至 F 这几种英文字符。如果某个十六进制数(例如内存地址)是以英文字符开头的,那么汇编器就会把它当成标识符看待,为了令其能够正确地将该值解读为字面量,你应该在前面添一个 0:
MASM/NASM
GAS 表示字面量的方式与 MASM 及 NASM 不同,而且要依照字面量所在的程序段来决定(程序段是汇编代码的五大支柱之一,参见 3.2.1 节)。.data 段里的字面量必须加上表示基数的前缀字符,用以指明字面量所采用的进制,而 .text 段里的字面量除了要加这种前缀,还得在其左侧多写一个美元符号($),如表 3-10 所示。十进制数例外,它不需要添加表示基数的前缀字符。
表 3-10 在 GAS 代码里表示字面量时所要添加的前缀与基数字符
下面这个例子演示了怎样在 .data 段及 .text 段中用不同的进制来表示十进制值 31。
GAS
实数(real number)要比整数复杂得多,我们留到第 8 章再讨论。
字符字面量(character literal)是由单个字符所构成的值,与整数字面量一样,也用来表示那种开发者在编写程序代码的时候就已经很清楚的值。MASM 与 NASM 中的字符字面量可以用一对单引号括起来,也可以用一对双引号括起来,这两种写法是等效的。
MASM/NASM
GAS 里的字符字面量的写法要根据所在的程序段来定。.data 段里的字面量用一对单引号括起来,.text 段里的字面量还得在前面加上美元符号($)。
GAS
提示:第 1 章说过,字符在存储器中是以整数形式的 ASCII 编码来表示的。例如 ‘A’ 这个字符在存储器中会表示成十进制的 65(也就是十六进制的 41)。
字符串字面量(string literal)是由多个字符字面量所组成的,通常用来表示单词或短语。MASM 与 NASM 的字符串与单个字符类似,也可以用一对单引号或双引号括起来,但是 GAS 则要求必须使用双引号。如果字符串的内容本身就有引号,那么对于 MASM 及 NASM 来说,你必须用另外一种引号把这个字符串括起来,而对于 GAS 来说则必须使用反斜线对字符串里的引号做转义处理,否则该字符串就会提前在这里结束。
GAS
MASM/NASM
字符串通常保存成字节数组,其中的每个字节都与字符串中处在该位置上的字符相对应,字节的内容就是字符的 ASCII 码。下面这个例子演示了字符串字面量 Daisy, daisy 是怎样以 ASCII 码的形式在内存中表示的。数组里的每个元素的取值就是字符串中的对应字符所具备的 ASCII 码。
- 点赞
- 收藏
- 关注作者
评论(0)