汇编基础----计算机结构简介--汇编简介
计算机内部硬件组成图:
软件系统:
中央处理器(CPU)
主要组成部分:运算器、控制器、寄存器
(一)、运算器:进行算术逻辑运算。对二进制进行加、减、乘、除基本运算,或、与、非的逻辑运算
组成:算术逻辑运算ALU、内部总线、通用寄存器组、输入多路开关和数据锁存器、输出移位多路开关。
(二)、控制器:用于计算机硬件系统中,指挥、协调各部件的工作。整个计算机的中枢。用于取指令、分析指令、执行指令、输入/输出控制、中断处理
组成:指令寄存器、指令计数器、指令译码器、地址形成部件、时序信号发生器、操作控制部件、中断机构。
(三)、寄存器组:是CPU内部的若干个存储单元,寄存器的数目因微处理器而定。用于暂存数据,避免频繁访问内存,缩短指令长度和执行时间。
分类:专用寄存器(堆栈指针、标志寄存器等作用于固定工作)、通用寄存器(多种用途)。
汇编语言的组成
汇编指令:机器码的助记符,有对应的机器码。是汇编语言的核心。
伪指令:没有对应的机器码,由编译器执行,计算机并不执行。
其他符号:如+、-、*、/等,由编译器识别,没有对应的机器码。
存储器
存储器主要存放指令和数据。如内存和磁盘。
计算机执行过成:CPU----内存----磁盘。
注:CPU不能直接访问磁盘,只能通过磁盘放入内存,CPU再从内存中访问。
指令和数据
在内存和磁盘上,指令和数据没有任何区别,都是二进制信息。
例如:
1000100111011000 --> 89D8H(数据) 1000100111011000 --> mov ax,bx(指令)
存储单元
存储器被划分成若干个存储单元,每个存储单元从0开始顺序编号。计算机中最小单元是bit(比特)。
单位换算:
bit(比特) byte(字节) word(字) dword(双字)
8bit = 1Byte 2Byte = 1Word 4Byte = 1dword 1024Byte = 1KB 1024KB = 1MB 1024MB = 1GB 1024GB = 1TB
CPU对存储器的读写
CPU读写流程图:
CPU对内存的操作:
首先指定存储单元的地址(存储单元从0开始顺序编号,这些编号可以看作存储单元在存储器中的地址),然后进行哪种操作(读/写)。
操作过成:
1.存储单元的地址(地址信息)
2.器件的选择,读或写的命令(控制信息)
3.读或写的数据(数据信息)
CPU通过总线来传送到存储器,分别是地址总线、控制总线、数据总线。
总线 | 含义 | 方向 | 特点 | 寻址 |
地址总线 | CPU通过它来指定存储单元 | 单向 | 总线能传送多少不同的信息,CPU就能对多少内存单元进行寻址 | 2^n n代表多少根地址总线 一根能传送2种 |
控制总线 | CPU与内存或其他器件的数据传送 | 通常单向 | 宽度决定了CPU和外界的数据传送速度 | 1根传送一个bit,8根一个字节,16根一个字 |
数据总 |
CPU对外部器件的控制 | 双向 | 宽度决定了CPU对外部器件的控制能力 | 无 |
内存地址空间
举例:一个CPU地址总线宽度为10,那么可以寻址1024个内存单元,这个单元就是内存地址空间。
主板
每一台PC机中,都有一个主板,主板上有核心器件和一些主要器件,它们都由地址总线相连。
器件举例:CPU、存储器、外围芯片、扩展插槽等
接口卡
计算机系统中,所有可用程序控制其工作的设备,必须受CPU控制。CPU不能直接对外部设备控制。直接控制这些设备的是插再扩展插槽上的接口卡,从而实现CPU对外设备的间接控制。
CPU-----(总线)-----扩展插槽上的接口卡-----控制设备
各类存储器芯片
从读写属性上分为随机存储器和只读存储器。
名称 | 属性 |
随机存储器 | 可读可写,必须带有电存储,关机后存储内容丢失。 |
只读存储器 | 只能读不能写,关机后其内容不会丢失。 |
从功能和连接上分为随机存储器、装有BIOS的ROM、接口卡上的RAM。
名称 | 属性 |
随机存储器 | 存放CPU使用的绝大部分程序和软件。 |
装有BIOS的ROM | BIOS系统软件 |
接口卡上的RAM | 暂时存储大批量输出、输出数据 |
- 内存地址空间
那些存储器在物理上都是独立的器件,其共同两点:
1.都和CPU的总线相连。
2.CPU对它们进行读写操作的时候都通过控制总线发出读写命令。
AT&T 格式Linux 汇编语法格式
- 在 AT&T 汇编格式中,寄存器名要加上 '%' 作为前缀;而在 Intel 汇编格式中,寄存器名不需要加前缀。例如:
AT&T 格式 |
Intel 格式 |
pushl %eax |
push eax |
2. 在 AT&T 汇编格式中,用 '$' 前缀表示一个立即操作数;而在 Intel 汇编格式中,立即数的表示不用带任何前缀。例如:
AT&T 格式 |
Intel 格式 |
pushl $1 |
push 1 |
3. AT&T 和 Intel 格式中的源操作数和目标操作数的位置正好相反。在 Intel 汇编格式中,目标操作数在源操作数的左边;而在 AT&T 汇编格式中,目标操作数在源操作数的右边。例如:
AT&T 格式 |
Intel 格式 |
addl $1, %eax |
add eax, 1 |
4. 在 AT&T 汇编格式中,操作数的字长由操作符的最后一个字母决定,后缀'b'、'w'、'l'分别表示操作数为字节(byte,8 比特)、字(word,16 比特)和长字(long,32比特);而在 Intel 汇编格式中,操作数的字长是用 "byte ptr" 和 "word ptr" 等前缀来表示的。例如:
AT&T 格式 |
Intel 格式 |
movb val, %al |
mov al, byte ptr val |
5. 在 AT&T 汇编格式中,绝对转移和调用指令(jump/call)的操作数前要加上'*'作为前缀,而在 Intel 格式中则不需要。
6. 远程转移指令和远程子调用指令的操作码,在 AT&T 汇编格式中为 "ljump" 和 "lcall",而在 Intel 汇编格式中则为 "jmp far" 和 "call far",即:
AT&T 格式 |
Intel 格式 |
ljump $section, $offset |
jmp far section:offset |
lcall $section, $offset |
call far section:offset |
7. 与之相应的远程返回指令则为:
AT&T 格式 |
Intel 格式 |
lret $stack_adjust |
ret far stack_adjust |
8. 在 AT&T 汇编格式中,内存操作数的寻址方式是
section:disp(base, index, scale) |
9. 而在 Intel 汇编格式中,内存操作数的寻址方式为:
section:[base + index*scale + disp] |
10. 由于 Linux 工作在保护模式下,用的是 32 位线性地址,所以在计算地址时不用考虑段基址和偏移量,而是采用如下的地址计算方法:
disp + base + index * scale |
架构:RISC精简指令集——CISC复杂指令集(以下三种汇编都在以上各自的架构上编写)
区别:CISC直接访问内存、RISC只能通过Load/Store访问内存。X86、ARM、MIPS三种汇编指令的区同:
- 32与64位寄存器
表达方式:
32位的寄存器前面会加E,如:eax.edi等待
64位的寄存器前面会加R,如:rax,rdi等等
64位和32位的寄存器和汇编的比较:https://blog.****.net/qq_29343201/article/details/51278798