千哥读书笔记:《汇编语言:基于x86处理器(英文版第8版)》第三章

从本篇读书笔记开始,将记录千哥对本书的一些内容的理解。

既然是读书笔记,那么我只将记录一些我认为一些重点的、难以理解的内容,而不是通篇介绍书中的全部内容,否则的话相当于我把书里的内容重新写一遍,还不如去看原书好。

对于本书的读书笔记,我将遵循以下几个原则:

1、原书上有的内容,只进行重点记录和分析。

2、对于原书上没有的、但可以帮助理解的内容,将以文字、图表或者截图的方式体现。

3、由于本笔记是针对原书英文版,所以也会对一些英文单词的理解加以强调,以便日后在阅读其他计算机英文资料的时候有所帮助。

4、笔记的内容并不是完全按照某一个章节的内容来写,有时候会把某几个章节内容进行串记。

5、为方便展示一些知识内容,部分示例将用16位汇编(即DOSBOX+debug)方式来分析。

因此,没有汇编语言基础的朋友,最好是先看王爽老师的《汇编语言(第四版)》,有了一定基础再来看我的笔记。在我的专栏里,专门有一个栏目是讲王爽老师的《汇编语言(第四版)》,有兴趣的朋友可以参考。

我写的笔记虽然可以帮大家学习相关知识,但毕竟是基于个人的理解,有些我认为的难点,未必就是你们的知识盲区。

一、本章一些需要重点理解的基本概念

(一)literal

这个单词,绝大多数的英文字典都是作“字面上的; 原义的; 逐字的; 言辞刻板的”来进行解释。在一些计算机书籍中,被翻译成“字面量”(比如《Javascript权威指南》),而在一些书籍(比如本书的中文版)则被翻译成“常量”。所以,以下词组对应的意思就是:

integer literal:整数常量,例如:26、26d、11010011b、1Ah、03Ah。

real number literal:实数常量,例如:+3.0、-44.2E+05

character literal:字符常量,例如:'A'、'B'、'C'

string literal:字符串常量,例如:'Good night'、"every day"、"Say 'good bye',bye bye...."。字符串常量用单双引号皆可,还可以用双引号和单引号进行嵌套。

……

以此类推。

(二)statement

这个单词,绝大多数的英文字典都是“声明; 表现; 陈述; 结算单”来进行解释。但在很多的计算机书中,都是作为“语句”来解释(比如本书的中文版)。例如,数据定义语句(Data Definition Statement):

count DWORD 12345

语句的格式分为三个部分:[name] directive initializer [,initializer] . . .

名称(name),可选项,分配了一个变量count。

伪指令(directive),可以有BYTE、WORD、DWORD、SBYTE等。

初始值(initializer),可以是整数变量或整数表达式。

(三)directive和instruction

这两个单词都有“指令”的意思,但其作用却完全不一样。

1、directive:常被翻译为“伪指令”

是嵌入源代码中的一种命令,由汇编器识别和执行。伪指令不在运行时执行,但它们可以定义变量、宏和子程序。默认情况下,伪指令是不区分大小写的。

2、instruction:常被翻译为“指令”

对照directive,是一种由一系列语句组成的、可以真正执行的命令。它们在程序汇编编译时变得可执行,汇编器将instruction翻译成机器语言字节。

比如在原书第63页给出的例子:

myVar DWORD 26

mov eax,myVar

其中“DWORD”就是一个directive(伪指令),告诉机器,26的数据类型是32位无符号整数。

而“mov eax,myVar”就是一条instruction(指令),告诉机器,从mov开始到整行结束,这条语句是可以翻译成机器码后并执行的。

1、directive(伪指令)可以分为以下几大类:

  • ‌段控制‌:如.section,用于指定程序的不同部分。例如,.text用于代码段,.data用于数据段‌。
  • ‌符号定义‌:如EQU,用于定义符号的值‌。
  • ‌存储空间初始化‌:如BYTE,用于初始化字节数据‌。
  • ‌程序说明‌:如PROC/ENDP,用于定义过程和结束过程‌。
  • ‌程序连接‌:如PUBLIC,用于指示符号可以被其他模块访问‌。
  • ‌地址控制‌:如ORG,用于设置下一个指令的起始地址‌。
  • ‌其他‌:如END,用于表示汇编源程序的结束‌。

2、instruction(指令)则由以下几部分组成:

  • 标号(可选)
  • 指令助记符(必需)
  • 操作数(通常是必需的)
  • 注释(可选)

(三)label

这个单词,很多时候是作“标签;标记”来翻译的,而在汇编语言中,往往被翻译成“标号”。

lable(标号)分为两种类型:

1、数据标号(data lable)

位于instruction(指令)的前面,表示指令的地址。

例如:count DWORD 100

在这里,count就是一个data lable(数据标号),表示定义了一个叫count的变量。

2、代码标号(code lable)

位于程序代码区(指令所在区段),用作跳转和循环指令的目标。

例如:

target:

mov ax,bx

...

jmp target

在这里,“target:”就表示从mov ax,bx到jmp target结束的指令所在区段的标号。而这种标号必须用冒号(:)结束。

又例如16位汇编中:

code segment

...

code ends

data segment

...

data ends

而这里,代表代码段的标号code和代表数据段的标号data,不用加冒号(:)。

需注意的是:

1、数据标号(data lable)一般与BYTE、WORD、DWORD(DB、DW、DD)等伪指令相结合,不但表示内存单元的地址,还表示了内存单元的长度,即表示在此标号的单元,是一个字节单元,还是字单元,还是双字单元。

2、代码标号(code lable)仅仅表示了内存单元的地址。

关于lable(标号)的知识,在王爽老师的《汇编语言(第四版)》第287页讲得比较透彻。

(四)instruction mnemonic

这个词组很简单,就是“指令助记符”,也就是帮助我们记忆指令的短单词,比如:MOV、ADD、SUB、INC等。

以上这些基本的概念,是最容易混淆的,如果不搞清楚这些概念,在学习后面的内容时候,我们的大脑会变得像浆糊一样。

二、本章一些需要重点理解的伪指令、指令或者概念、方法

(一)基于等号(=)伪指令的符号常量(symbolic constants)创建

简单地说,就是用一个名称代表一个数值,这个名称在任何可执行的指令中,就代表这个数值,例如:

COUNT = 500

在32位汇编的环境下,这个名称(COUNT)代表的是一个32位的整数值,而COUNT就是用等号(=)伪指令创建的符号常量。

而这个符号常量(COUNT)不会预留存储空间,它

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值