汇编语言(一)

一、编程语言

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送入寄存器axAx=18
add al,8寄存器ax低字节数值加上18Ax=ax+18
mov ah,bx寄存器bx的数据送入ax高字节Ax=bx
add ax,bx寄存器ax与bx数据相加,存到axAx=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 [内存单元],寄存器

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:深蓝海洋 设计师:CSDN官方博客 返回首页
评论

打赏作者

lulin96a

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值