赞
踩
一、编程语言
1)机器语言
机器语言是机器指令的集合。在计算机中是一串0、1二进制数,计算机转变为高低电平,器件受到震动,进行运算。由于硬件设计和内部结构的不同,需要不同的电平脉冲来控制使它工作,所以每一种微处理器都有自己的机器指令集,即机器语言。
2)汇编语言
由于机器码的晦涩难懂和不易查错,很快产生了汇编语言。在汇编语言中,用助记符代替机器指令的操作码,用地址符号或标号代替指令或操作数的地址,便于阅读和记忆,但汇编语言仍然能“看见”机器的硬件结构,可以编写直接访问机器硬件资源的程序 例如, 操作:寄存器BX的内容送入到AX中 机器指令:1000100111011000 汇编指令:mov ax,bx
3)高级语言
高级语言(High-level programming language)是一种独立于机器,面向过程或对象的语言。高级语言是参照数学语言而设计的近似于日常会话的语言。高级语言程序“看不见”机器的硬件结构,与计算机的硬件结构及指令系统无关,它有更强的表达能力。 例如,要将2个变量相加并赋值给第三个变量,用高级语言表达为var3=var1+var2 [
但计算机能读懂的只有机器指令,其他语言编写的程序需要经过翻译程序将其转换成机器语言,这样的程序叫作编译器
二、编译
计算机能读懂的只有机器指令,其他语言编写的程序需要经过翻译程序将其转换成机器语言,这样的程序叫作编译器。
现代编译的主要工作流程:源代码 (source code) → 预处理器 (preprocessor) → 编译器 (compiler) → 目标代码 (object code) → 链接器 (Linker) → 可执行程序 (executables)
编译器:就是将“一种语言(通常为高级语言)”翻译为“另一种语言(通常为低级语言)”的程序。、 汇编器(assembler)是一种编译程序,是专门用于将汇编语言源程序转换为机器语言的程序。 链接器(linker)也是一种工具程序,它把汇编器生成的单个文件组合为一个可执行程序。 调试器(debugger),使程序员可以在程序运行时,单步执行程序并检查寄存器和内存状态。
以下是汇编语言从编写到执行的流程:
三、汇编语言
组成: 汇编指令:是机器指令便于记忆的书写格式,与机器语言是一对一(one-to-one)的关系 伪指令:没有对应的机器指令,是由编译器执行的指令,进行相关的编译工作。 运算符号:+、-、*、/ 等,由编译器识别,没有对应的机器码
HelloWorld程序:
//数据段 DATAS SEGMENT STRING DB 'Hello World!',13,10,'$' DATAS ENDS //代码段 CODES SEGMENT ASSUME CS:CODES,DS:DATAS START: MOV AX,DATAS MOV DS,AX LEA DX,STRING MOV AH,9 INT 21H MOV AH,4CH INT 21H CODES ENDS END START
四、存储器
汇编语言是基于计算机硬件系统编程的,且CPU所能访问的是内存地址空间的地址,所以我们必须知道这个系统中内存地址空间分配情况。 指令与数据的区别:内存和磁盘中,指令和数据并没有区别,都是二进制信息,CPU工作时区分二者。
1)存储器
先了解一下计算机中一些构件:
主板:将一些核心器件如CPU、存储器、外围芯片组、扩展插槽等,通过总线相连到一块电路板上。扩展插槽一般插有RAM内存条和各类接口卡。
接口卡:扩展插槽上有多个接口卡,通过总线和CPU相连,能直接控制外部设备的工作,是CPU控制外部设备的接口。CPU通过总线向接口卡发送命令,接口卡根据CPU命令控制外设进行工作。
存储器:一台存储器中有多个存储器芯片,这些芯片通过总线相连。
根据随机存取方式,可以分为两类随机存储器RAM和只读存储器ROM,RAM可读可写,但必须带电存储,关机后丢失;ROM只能读取不能写入。
根据存储容量和所在位置,又可分为寄存器、高速缓存、主存储器以及外部存储器这 4 类。
寄存器是计算机中存储容量最小(通常为 4~8 个字节)、读写速率最快的存储器,位于 CPU 内部。用于临时保存 CPU 运行所需要的数据或者当前 CPU 正在处理的指令,所有需 CPU 处理的数据,都必须经过寄存器。
高速缓存是一种存储容量较小、读写效率介于寄存器和主存储器之间的存储器,因此它主要用于协调高速的 CPU 和读写效率低的主存储器之间的数据传输问题。高速缓存可以保存 CPU 经常使用的数据和指令,确保 CPU 使用这些数据时可以直接从高速缓存中找到,而无需再访问主存储器,从而提高 CPU 处理数据的效率。它又可以细分为一级缓存、二级缓存、三级缓存等。对于现代的个人电脑,这三级缓存往往都集成在 CPU 内部;
主存储器,简称主存,它有 2 种类型,即 RAM (random access)类型主存和 ROM (read only)类型主存。根据实际场景的需要,不同用途的计算机可以选择配备 RAM 或者 ROM 主存,甚至两种都用。比如,我们现在使用的笔记本电脑中,内存条其实就是集成多个 RAM 存储芯片的电路板;计算机内部还含有多个 ROM 芯片,用于存储 BIOS 系统、某些硬件的驱动程序等等
外部存储器,支持永久性地存储数据,同时还支持用户对其内部的数据做修改、删除等操作。注意,CPU 无法直接访问外部存储器,其内部的数据需先传输到 RAM 主存中,CPU 才能访问它。
2)物理地址
存储器被划分成若干个存储单元,每个存储单元从0开始顺序标号,这些标号可以看作是存储单元在存储器中的地址。 一个存储单元的大小为1Byte,即8个二进制位。
易混单位:
字节:8bit,是计算机处理数据的基本单位,计算机以字节为单位存储和解释信息
字:计算机在进行数据处理,一次存取、加工、传送的数据长度称为字(word)。
机器字长:CPU一次能处理数据的位数,通常与CPU的寄存器位数有关。
存储字长:存储器中一个存储单元的存储地址所存储的二进制代码的位数,即存储器中的MDR的位数。
指令字长:计算机指令字的位数。
数据字长:计算机数据存储所占用的位数。
物理地址:每一个内存单元都有一个唯一的物理地址。所有内存单元构成的存储空间是一个一维线性空间。
物理地址的形成:以8086CPU为例,其地址线宽度为20,但其为16位结构CPU,一次仅能处理16位地址。8086CPU采用在内部用两个16位地址合成的方法,通过一个地址加法器,形成一个20位物理地址,再输入控制电路。
8086CPU中,地址加法器采用 物理地址=段地址*16+偏移地址,乘16相当于左移4位(参考10进制中,左移一维相当于乘10,右移一位相当于除以10),本质为 **基础地址+偏移地址=物理地址
3)内存地址空间
地址总线可寻到的内存单元构成这个CPU的内存地址空间。 对于CPU来说,系统中所有存储器的存储单元都处于一个统一的逻辑存储器中,容量受CPU寻址能力的限制,这个逻辑存储器及我们所说的内存地址空间。
当我们希望向显示器输出一段信息,那么必须将这段信息写入显存中,显卡才能将它输出到显式器上,向显存中写入数据,则必须知道显存在内存空间的地址。
4)寄存器
一个典型的CPU由运算器、控制器、寄存器等器件构成,这些器件依靠CPU内部总线相连。在CPU中,运算器进行信息处理;寄存器进行信息存储;控制器控制各种器件进行工作;内部总线连接各种器件,在他们之间进行数据传送。 对于一个汇编程序来说,程序员面向机器部件通过指令读写部件,通过改变各种寄存器中的内容实现对CPU的控制。
汇编指令中直接使用寄存器的缩写代表寄存器地址。 不同数据要存放在不同的寄存器中,如通用寄存器AX、BX、CX、DX通常用来存放一般性数据,新一代寄存器均为16位,但为兼容8位,每个寄存器可分为两个8位寄存器分别记为( AH,AL),(BH,BL)。
常用寄存器如下:
常用寄存器缩写 |
---|
AH&AL=AX(accumulator):累加寄存器 |
BH&BL=BX(base):基址寄存器 |
CH&CL=CX(count):计数寄存器 |
DH&DL=DX(data):数据寄存器 |
SP(Stack Pointer):堆栈指针寄存器 |
BP(Base Pointer):基址指针寄存器 |
SI(Source Index):源变址寄存器 |
DI(Destination Index):目的变址寄存器 |
IP(Instruction Pointer):指令指针寄存器 |
CS(Code Segment)代码段寄存器 |
DS(Data Segment):数据段寄存器 |
SS(Stack Segment):堆栈段寄存器 |
ES(Extra Segment):附加段寄存器 |
OF overflow flag 溢出标志 操作数超出机器能表示的范围表示溢出,溢出时为1. |
SF sign Flag 符号标志 记录运算结果的符号,结果负时为1. |
ZF zero flag 零标志 运算结果等于0时为1,否则为0. |
CF carry flag 进位标志 最高有效位产生进位时为1,否则为0. |
AF auxiliary carry flag 辅助进位标志 运算时,第3位向第4位产生进位时为1,否则为0. |
PF parity flag 奇偶标志 运算结果操作数位为1的个数为偶数个时为1,否则为0. |
DF direcion flag 方向标志 用于串处理.DF=1时,每次操作后使SI和DI减小.DF=0时则增大. |
IF interrupt flag 中断标志 IF=1时,允许CPU响应可屏蔽中断,否则关闭中断. |
TF trap flag 陷阱标志 用于调试单步操作. |
字在寄存器中的存储:一个字存在一个16位寄存器中,高字节和低字节分别存在寄存器的高8位和低8位寄存器中;也可以看作两个独立的字节型数据。
以下是几条汇编指令:
汇编 | 执行操作 | 高级语言 |
---|---|---|
mov ax,18 | 将18送入寄存器ax | Ax=18 |
add al,8 | 寄存器ax低字节数值加上18 | Ax=ax+18 |
mov ah,bx | 寄存器bx的数据送入ax高字节 | Ax=bx |
add ax,bx | 寄存器ax与bx数据相加,存到ax | Ax=ax+bx |
5)段的概念:
CPU将若干连续的内存单元逻辑上看作一个段。将内存单元分成较大的段,再通过寄存器协助可以方便地找到目标内存单元的地址,寻址更快和高效。
段寄存器:寄存段地址,CS、DS、SS、ES,其相对应的指针寄存器是 IP、BP、SP
8086CPU不支持将数据直接送入段寄存器的操作,故修改段寄存器地址,只能使用 mov 段寄存器,通用寄存器转换
1.代码段:
CS(Code Segment)代码段寄存器,记录代码起始地址,与此相关的寄存器是IP指令指针寄存器,指令物理地址为 CS*16+IP,CS:IP指向的内容即为指令行
程序员可以通过修改CS、IP内容控制CPU执行目标程序
jmp指令:转移指令,改变CS、IP中的内容
jmp 段地址:偏移地址 jmp 2AE3:3 执行后CS=2AE3H,IP=0003H,CPU将从2AE33H处读取指令 jmp 寄存器名称 jmp ax 执行后IP=ax 好似 mov IP,ax
2.数据段:
DS(Data Segment)数据段寄存器,专门存储要访问数据的段地址的一段内存空间
mov bx,1000H mov ds,bx mov al,[0] 将 1000H(1000:0)中的数据读到al中
3)栈段:
SS(Stack Segment)堆栈段寄存器,是一块特殊访问方式的存储空间,数据遵循先进后出的原则。于此相关的寄存器是SP堆栈指针寄存器,任意时刻as:sp即位栈顶地址。基本的操作为入栈和出栈.
入栈:
出栈:
注意在栈满时入栈,栈空时出栈都会引起超界,超界会造成栈之外的空间数据、代码意外改写,将会引发一连串的问题,在CPU中设置记录栈上限和下限的寄存器
小结
五、总线
CPU需要获取存储器中的数据或指令进行计算,最后有将计算结果输出到存储器中。如何快速高效的读写存储器的数据呢?
首先CPU若要进行数据的读写,必须跟外部器件下面三类信息的交互:
1)存储单元地址。
2)操作哪一个硬件,指明是读命令还是写命令(控制信息)
3)读入或写出的数据
其次,电子计算机能处理、传输的信息都是电信号,电信号当然是用导线传送,每一个CPU都有许多管脚,这些管脚和外部其他部件通过导线相连,通常称为总线。物理上总线就是一根根导线的集合,逻辑上可分为三类:
a.地址总线:传送指定存储单元地址的,地址总线能传送多少个不同的信息,CPU就可以对多少个存储单元进行寻址,决定了CPU的寻址能力。如一个CPU有10根导线,共有2的10次方个电信号,所以能够找寻1024个地址单元
b.控制总线:CPU通过控制总线发送信号对外部器件控制的,有N跟控制总线,意味着对外部有2的N次方中控制,其决定了对外部器件的控制能力。
c.数据总线:传输CPU与其他器件之间的数据传送。N跟数据总线一次可以传送8位二进制数据。
六、基本指令
mov 寄存器,数据/寄存器/内存单元
mov 寄存器,[内存单元]
mov 段寄存器,寄存器
add 寄存器,数据/寄存器/内存单元
add [内存单元],寄存器
sub 寄存器,数据/寄存器/内存单元
sub [内存单元],寄存器
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。