《汇编程序设计与计算机体系结构:软件工程师教程》 —3.2.2 字面量

举报
华章计算机 发表于 2019/12/04 12:05:45 2019/12/04
【摘要】 本节书摘来自华章计算机《汇编程序设计与计算机体系结构:软件工程师教程》一书中第3章,第3.2.2节,作者是布莱恩·R. 霍尔(Brian R. Hall)[美] 凯文·J.斯隆卡(Kevin J. Slonka),爱飞翔 译。

3.2.2 字面量

字面量(literal value,字面值)也叫作立即值(immediate,立即数),用来表示那些由开发者明确指定的值,例如整数、实数、字符、字符串等。比方说,下面这行代码会把 5 这个字面值与 32 位寄存器 eax 的当前值相加,并将结果放入该寄存器。

 image.png

      编程知识:立即值用在那种开发者已经提前知道指令里该用什么值的场合。很多程序都依赖于用户所输入的数据,但除此之外,可能还会用到一些固定的值。比方说,要编写一个简单的程序把体重从磅换算为公斤。这个程序一方面要从用户那里获得以磅为单位的体重数据,另一方面则要将该数据与换算系数相乘(也就是乘以 0.45)将其转为以公斤为单位的结果。该程序所用到的这个换算系数就可以用字面量来表示。

 

整数字面量(integer literal)一般写为十进制(或者说以 10 为底的进制)的整数。在有些情况下也可以(甚至是必须)采用其他进制来写。MASM 及 NASM允许开发者在字面量之后写上一个表示基数的字符,以指出这个字面量所采用的进制。表 3-9 列出了这些字符。

表 3-9 MASM/NASM 所支持的基数字符,用来指出整数所采用的进制

image.png

 

下面这个例子演示了怎样用 MASM 及 NASM 所支持的这几种基数字符来表示十进制的 31。

MASM/NASM

 image.png

有一种情况要注意,十六进制数的数位中可能会出现 A 至 F 这几种英文字符。如果某个十六进制数(例如内存地址)是以英文字符开头的,那么汇编器就会把它当成标识符看待,为了令其能够正确地将该值解读为字面量,你应该在前面添一个 0:

MASM/NASM

 image.png

GAS 表示字面量的方式与 MASM 及 NASM 不同,而且要依照字面量所在的程序段来决定(程序段是汇编代码的五大支柱之一,参见 3.2.1 节)。.data 段里的字面量必须加上表示基数的前缀字符,用以指明字面量所采用的进制,而 .text 段里的字面量除了要加这种前缀,还得在其左侧多写一个美元符号($),如表 3-10 所示。十进制数例外,它不需要添加表示基数的前缀字符。

表 3-10 在 GAS 代码里表示字面量时所要添加的前缀与基数字符

image.png

 

下面这个例子演示了怎样在 .data 段及 .text 段中用不同的进制来表示十进制值 31。

GAS

 image.png

实数(real number)要比整数复杂得多,我们留到第 8 章再讨论。

字符字面量(character literal)是由单个字符所构成的值,与整数字面量一样,也用来表示那种开发者在编写程序代码的时候就已经很清楚的值。MASM 与 NASM 中的字符字面量可以用一对单引号括起来,也可以用一对双引号括起来,这两种写法是等效的。

MASM/NASM

 image.png

GAS 里的字符字面量的写法要根据所在的程序段来定。.data 段里的字面量用一对单引号括起来,.text 段里的字面量还得在前面加上美元符号($)。

GAS

 image.png

      提示:第 1 章说过,字符在存储器中是以整数形式的 ASCII 编码来表示的。例如 ‘A’ 这个字符在存储器中会表示成十进制的 65(也就是十六进制的 41)。

 

字符串字面量(string literal)是由多个字符字面量所组成的,通常用来表示单词或短语。MASM 与 NASM 的字符串与单个字符类似,也可以用一对单引号或双引号括起来,但是 GAS 则要求必须使用双引号。如果字符串的内容本身就有引号,那么对于 MASM 及 NASM 来说,你必须用另外一种引号把这个字符串括起来,而对于 GAS 来说则必须使用反斜线对字符串里的引号做转义处理,否则该字符串就会提前在这里结束。

GAS

 image.png

MASM/NASM

 image.png

字符串通常保存成字节数组,其中的每个字节都与字符串中处在该位置上的字符相对应,字节的内容就是字符的 ASCII 码。下面这个例子演示了字符串字面量 Daisy, daisy 是怎样以 ASCII 码的形式在内存中表示的。数组里的每个元素的取值就是字符串中的对应字符所具备的 ASCII 码。

image.png

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。