汇 编语言_00

汇编语言(assembly language)是一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。在汇编语言中,用助记符(Mnemonics)代替机器指令的操作码,用地址符号(Symbol)或标号(Label)代替指令或操作数的地址。在不同的设备中,汇编语言对应着不同的机器语言指令集,通过汇编过程转换成机器指令。普遍地说,特定的汇编语言和特定的机器语言指令集是一一对应的,不同平台之间不可直接移植。

许多汇编程序为程序开发、汇编控制、辅助调试提供了额外的支持机制。有的汇编语言编程工具经常会提供宏,它们也被称为宏汇编器。
汇编语言不像其他大多数的程序设计语言一样被广泛用于程序设计。在今天的实际应用中,它通常被应用在底层,硬件操作和高要求的程序优化的场合。驱动程序、嵌入式操作系统和实时运行程序都需要汇编语言。

汇编语言的主体是汇编指令。汇编指令和机器指令的差别在于指令的表示方法上。汇编指令是机器指令便于记忆的书写格式。
汇编指令编写的程序通过编译器转换成计算机能读懂的机器指令,再进行执行。

CPU寄存器
8086 CPU 寄存器总共为 14 个,且均为 16 位 。
即 AX,BX,CX,DX,SP,BP,SI,DI,IP,FLAG,CS,DS,SS,ES 共 14 个。

汇 编语言_00_第1张图片
8086内部寄存器.png
  • 通用寄存器
通用寄存器可用于传送和暂存数据,也可参与算术逻辑运算,并保存运算结果。除此之外,它们还各自具有一些特殊功能。通用寄存器的长度取决于机器字长,汇编语言程序员必须熟悉每个寄存器的一般用途和特殊用途,只有这样,才能在程序中做到正确、合理地使用它们。
  • 数据存储器
数据寄存器主要用来保存操作数和运算结果等信息,从而节省读取操作数所需占用总线和访问存储器的时间。
* AX(Accumulator):累加寄存器,也称之为累加器;
* BX(Base):基地址寄存器;
* CX(Count):计数器寄存器;
* DX(Data):数据寄存器;

由于在 8086 之前的 CPU 为 8 位 CPU,所以为了兼容以前的 8 位程序,在 8086 CPU 中,每一个数据寄存器都可以当做两个单独的寄存器来使用,由此,每一个 16 位寄存器就可以当做 2 个独立的 8 位寄存器来使用了 。

  • AX 寄存器可以分为两个独立的 8 位的 AH 和 AL 寄存器;
  • BX 寄存器可以分为两个独立的 8 位的 BH 和 BL 寄存器;
  • CX 寄存器可以分为两个独立的 8 位的 CH 和 CL 寄存器;
  • DX 寄存器可以分为两个独立的 8 位的 DH 和 DL 寄存器;
  • 指针寄存器

    • SP(Stack Pointer):堆栈指针寄存器;
    • BP(Base Pointer):基指针寄存器;
  • 变址寄存器

    • SI(Source Index):源变址寄存器;
    • DI(Destination Index):目的变址寄存器;
  • 控制寄存器

    • IP(Instruction Pointer):指令指针寄存器,是一个16位专用寄存器,它指向当前需要取出的指令字节,当BIU从内存中取出一个指令字节后,IP就自动加(取出该字节的长度,如:BIU从内存中取出的是1个字节,IP就会自动加1,如果BIU从内存中取出的字节数长度为3,IP就自动加3),指向下一个指令字节。注意,IP指向的是指令地址的段内地址偏移量,又称偏移地址(Offset Address)或有效地址(EA,Effective Address)。
    • FLAG:标志寄存器,又称程序状态字(Program Status Word,PSW)。这是一个存放条件标志、控制标志寄存器,主要用于反映处理器的状态和运算结果的某些特征及控制指令的执行。
  • 段寄存器

段寄存器是因为对内存的分段管理而设置的。计算机需要对内存分段,以分配给不同的程序使用(类似于硬盘分页)。在描述内存分段时,需要有如下段的信息:1.段的大小;2.段的起始地址;3.段的管理属性(禁止写入/禁止执行/系统专用等)。需要用8个字节(64位)存储这些信息,但段寄存器只有16位,因此段寄存器中只能存储段号(segment selector,也译作“段选择符”),再由段号映射到存在内存中的GDT(global (segment) descriptor table,全局段号记录表),读取段的信息。16位CPU有四个16位段寄存器,所以,其程序可同时访问四个不同含义的段。8086CPU有20根地址线,最大可寻址内存空间为1MB。而8086的寄存器只有16位,指令指针(IP)和变址寄存器(SI、DI)也是16位的。用16位的地址寻址1MB空间是不可能的。所以就要把内存分段,也就是把1MB空间分为24,即16个段,每段不超过64KB(216,16位数据线就可以寻址)。在8086中设置4个16位的段寄存器,用于管理4种段:CS是代码段,DS是数据段,SS是堆栈段,ES是附加段。把内存分段后,每一个段就有一个段基址,段寄存器保存的就是这个段基址的高16位,这个16位的地址左移四位(后面加上4个0)就可构成20位的段基址。
  • CS(Code Segment):代码段寄存器,放当前正在运行的程序代码所在段的段基址,表示当前使用的指令代码可以从该段寄存器指定的存储器段中取得,相应的偏移量则由IP提供。
  • DS(Data Segment):数据段寄存器,指出当前程序使用的数据所存放段的最低地址,即存放数据段的段基址。
  • SS(Stack Segment):堆栈段寄存器,指出当前堆栈的底部地址,即存放堆栈段的段基址。
  • ES(Extra Segment):附加段寄存器,指出当前程序使用附加数据段的段基址,该段是串操作指令中目的串所在的段。

SP 寄存器实质上必须和 SS 段寄存器一起使用

编译工具

  • Emu8086
    汇 编语言_00_第2张图片
    工具图

语法

8086 CPU 寄存器简介

你可能感兴趣的:(汇 编语言_00)