从本篇读书笔记开始,将记录千哥对本书的一些内容的理解。
既然是读书笔记,那么我只将记录一些我认为一些重点的、难以理解的内容,而不是通篇介绍书中的全部内容,否则的话相当于我把书里的内容重新写一遍,还不如去看原书好。
对于本书的读书笔记,我将遵循以下几个原则:
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)不会预留存储空间,它

最低0.47元/天 解锁文章
2801

被折叠的 条评论
为什么被折叠?



