汇编语言、指令执行、CPU寄存器和内存
Execution of instructions
- 指令执行
取指-执行循环(fetch-execution cycle):
• CPU遵循“取指-执行”循环。取指阶段对于所有指令都是一致的,而执行阶段则取决于指令的类型。
指令类型:
• CPU使用不同类型的指令,这些指令可以组合起来完成复杂的计算。
• 指令还用于实现**高级语言(HLL)**的结构,如循环、条件语句等。
CPU与指令(instruction)
• 每个CPU都有一组独特的指令集,这些指令以二进制机器码的形式表示。
• 虽然每种CPU的指令集可能不同,但指令执行的一般原理是相似的。
• 本讲座重点讨论 Pentium CPU 系列。(Pentium family of CPUS)
Assembly language and assembler
- 汇编语言与汇编器
为了更深入地研究程序是如何被执行的,我们将为Pentium处理器编写一些简单的程序。我们将这些程序以Pentium机器代码的助记形式来编写。这种助记形式的代码被称为汇编语言。
助记符形式(Mnemonic form):
• 与直接使用机器码不同,程序员可以使用助记符形式,即汇编语言,它是机器码的可读版本。
汇编器:
• 汇编器是一种将汇编语言转换为二进制机器码(binary machine-code)(也称为目标代码)的程序。
• 汇编器还会为内存地址生成标签(labels),使程序能够重定位。
Label
- 汇编语言中使用标签(Labels)来表示内存地址。
- 标签用于指示程序中的某些关键点,帮助程序在执行时能够准确跳转或引用特定内存地址。
- 通常,标签用于循环(loop)的开始,或内存块(a block of memory cells)的起点。
可重定位性(Relocatable Programs):
• 为了执行程序,必须将其加载到主存储器的某个位置。
• 程序必须具有可重定位性,这意味着程序可以在内存的不同位置执行,而不会因为内存地址的改变而出现错误。
对象文件(Object File):
1.汇编器将汇编语言翻译成二进制机器码,这种机器码保存在一个对象文件中。
2.对象文件包含:
• 二进制机器码。
• 编译后生成的中间代码,尚未形成完整的可执行程序。
链接器(Linker):
- 有时,多个对象文件需要通过链接器连接在一起,生成最终的可执行文件或库文件。
- 链接器的作用是将多个对象文件组合起来,处理外部引用,使程序可以正常运行。
• Program must be relocatable
• Produces a binary machine object code program(object file)
(对象代码是编译过程中的一个中间产物,它包含了机器代码和一些未解决的引用,通常需要链接器(linker)来处理这些引用,并生成最终的可执行程序)
Main memory,RAM
-
主存储器与RAM
内存 vs 外存:
• 内存(主存储器):用于临时存储程序和数据,速度快,容量相对较小。例如:RAM。
• 外存(辅存):用于长久存储数据,即使断电数据也不会丢失。外存包括硬盘驱动器(HDD)、固态硬盘(SSD)等。主存储器:
• CPU只能执行存储在主存储器(RAM)中的指令。内存是用于存储当前正在执行的指令和数据的地方。主存储器提供了CPU执行程序的工作区
RAM(随机存取存储器):
Random Access Memory
• RAM允许以随机方式存取存储的数据,这意味着CPU可以直接访问内存中的任何位置,而无需按顺序读取。
• 与顺序访问存储器(Sequential Access Memory)不同,RAM允许快速访问存储在任意位置的数据,而不需要逐个遍历前面的数据块。
• 举例:在顺序存储介质中(如磁带),访问末尾的数据需要经过所有前面的数据块,而在RAM中,无论数据存储在哪里,访问时间都是相同的。
RAM的结构与特性
1. 存储单元:
• 主存储器可以看作是一组编号的存储单元(numbered storage elements),每个存储单元被称为一个字(word)。每个“字”可以存储一些信息。
2. 地址编号:
• 每个存储单元都有一个唯一的地址,可以通过该地址访问存储在单元中的数据。
3. 随机访问:
• RAM的特点是可以直接访问任何存储单元,而不必依赖前面的存储单元(without touching the preceding words)。这就是所谓的“随机访问”(Random Access),即访问内存的时间不受位置影响。
4. 访问时间相同:
• 不论访问的是哪个存储单元,访问时间对于所有存储单元都是相同的。这是RAM的重要特性之一。
Words,bytes and bits
-
字、字节和位
字(Word):
• 内存的基本存储单位(elementary storage elements/memory cells)是“字”。每个字由多个存储单元(称为位bit)组成,常见的字长为32位或64位。
字节(Byte):
• 字节是由8个位(bit)组成的基本存储单位。大多数计算机使用字节来表示和处理数据。
CPU Register in Pentium
-
Pentium CPU寄存器
CPU寄存器:
• CPU包含多个寄存器,用于处理数据和存储内存地址。寄存器是CPU内部的高速存储器,能够非常快速地存取数据。
常见的寄存器包括:
• EAX(累加器accumulator):用于算术和逻辑操作。某些指令默认使用累加器。
• EBX(基址寄存器base register):用于存储数据结构(如数组)的基址。
• ECX(计数寄存器count register):通常用于循环中的计数操作。
• EIP(指令指针instructioin pointer):存储下一条要执行指令的内存地址。
• ESI(源索引寄存器)和EDI(目标索引寄存器):用于字符串或数组的操作,分别指向源和目标地址。
EAX registerer, Accumulator
隐式使用:在某些指令(如MUL和DIV)中,EAX寄存器被默认使用为累加器,程序员不需要显式(explicitly)地写出使用它。
• 分块访问:EAX寄存器可以被按不同大小的块(bit chunk)访问:
• AL:最低8位。
• AH:次低8位。
• AX:16位。
• EAX:32位(全寄存器)。
这使得EAX寄存器非常灵活,可以处理从小到大的数据量。
Examples of instructions using EAX
在汇编指令中使用EAX寄存器。
• MOV EAX, 1234H:
将常量值1234H(十六进制值,等于十进制的4660)加载到EAX寄存器中。这是一条数据传输指令,表示将数据移动到累加器中。
• INC EAX:
将EAX寄存器中的值加1。这是一条加法指令,用于对EAX寄存器中的值进行自增操作。
• MOV maxval, EAX:
将EAX寄存器中的值存储到内存变量maxval中。这里展示了如何将寄存器中的数据移动到内存中。
• DIV CX:
使用16位寄存器CX中的值对累加器EAX中的值进行除法运算。这是一条算术指令,展示了如何对累加器中的数据进行数学操作。
1. EBX: Base Register
• EBX 是一个基址寄存器,通常用来存储数据结构(如数组)在内存中的基地址。
• 指令示例:
• LEA EBX, marks: 将变量 marks 的地址加载到 EBX 中。
• MOV AL, [EBX]: 使用 EBX 作为内存指针(pointer),获取 1 字节的值并存储到 AL 寄存器中。
2. ECX: Count Register
• ECX 是用于循环计数的寄存器。通常用于循环中,自动递减。
• 指令示例:
• MOV ECX, 100: 初始化 ECX 为 100,用于 for 循环的计数器。
• LOOP for1: 每次循环递减 ECX,测试是否为零,如果不为零则跳转回 for1。
3. EIP: Instruction Pointer
• EIP(指令指针)保存着下一条要执行的指令的地址。它通常也被称为程序计数器(Program Counter)。
• 指令示例:
• JMP mylabel: 将新的地址加载到 EIP 中,程序将跳转到指定的地址 mylabel。
4. Further Registers: ESI, EDI
• ESI: 源索引寄存器,常用于字符串或数组操作中的源地址。
• 指令示例:
• MOV AX, [EBX + ESI]: 使用 EBX 作为基地址,ESI 作为索引,获取 16 位的数据并存储到 AX 寄存器中。
• EDI: 目的索引寄存器,常用于字符串或数组操作中的目标地址。
• 指令示例:
• MOV EAX, [ESI]: 将 ESI 寄存器中的 32 位值移动到 EAX 寄存器中。
• MOV [EDI], EAX: 将 EAX 中的值存储到 EDI 指定的内存位置。
5. Further Registers: ESP, EBP
• ESP: 栈指针(Stack Pointer),指向栈顶。
• EBP: 栈基址指针(Stack Base Pointer),通常用于访问栈中的局部变量。
这些寄存器在汇编语言中非常重要,用于执行各种运算、内存操作和控制流程。
Q&A
- execute 阶段是否对所有指令类型都相同?
• 解释:在CPU执行指令时,不同类型的指令(如算术运算、跳转指令等)的执行阶段可能不同。例如,加法指令与跳转指令所执行的操作本质上不同,因此这句话是False。
- 汇编器将汇编语言翻译成哪种形式?
• 解释:汇编器会将汇编语言转换为机器代码(Machine Code),这是一种CPU可以直接理解和执行的二进制指令。
- 汇编器将标签与什么关联?Assembler associates labels with
• 解释:汇编器将标签与内存地址关联。标签通常用于表示跳转或循环的目标位置,帮助程序找到相应的内存位置。
- CPU只能执行加载到主存储器(RAM)中的指令(True or False)?
• 解释:这是True。CPU只能执行那些已经被加载到RAM中的指令,因为CPU无法直接从磁盘等辅助存储器中读取和执行指令。
- RAM的所有存储单元的访问时间是否相同(True or False)?
• 解释:这是True。RAM中的所有单元都是随机访问的,意味着访问任意单元的时间是相同的,而不像顺序访问存储器(如磁带)那样依赖于数据的位置。
6.MOV EBX, [EBX] 指令的含义是什么?
• 解释:这条指令将EBX寄存器的值作为地址,从该地址处取出值并存入EBX寄存器中。因此,EBX首先表示一个内存地址,然后将该内存地址中的值赋给自己。这种操作类似于“解引用”指针。
• 副作用:该指令会覆盖掉EBX中的原始值,EBX不再保存原本的地址,而是变成该地址处的内容。
7.JNZ L2是什么意思?
• 解释:JNZ是汇编中的“跳转如果不为零”(Jump if Not Zero)指令。它表示如果零标志(ZF)位没有被设置(即结果不为零),程序就会跳转到标签L2所指示的内存地址处。
• 编译错误:如果L2没有在代码中定义,编译器会报错,因为它找不到需要跳转的位置。
8.MOV maxval, loc1是否为有效的汇编代码?
• 解释:这取决于loc1和maxval是否已被**定义为有效的内存地址或寄存器**。如果它们没有被正确定义,那么这条指令可能会报错,无法编译通过。
标签:RAM,EAX,指令,寄存器,Lecture,101,EBX,CPU
From: https://blog.csdn.net/gyh101010/article/details/143090302