汇编语言——王爽版总结

基础知识

  • 汇编语言包括汇编指令和伪指令还有其他符号
  • 在内存或磁盘上,指令和数据没有任何区别,都是二进制
  • CPU对存储器的读写是通过总线
    • 总线从逻辑上又分为地址总线和控制总线还有数据总线
  • 对于CPU来说,系统中的所有存储器中的存储单元都处于一个统一的逻辑存储器中,它的容量受CPU寻址能力的限制。这个逻辑存储器即是我们所说的内存地址空间。

寄存器

  • 寄存器分为通用寄存器和段寄存器还有其他的寄存器
  • AX,BX,CX,DX都是通用寄存器,还可以细分为AH和AL其他寄存器同样,AL和AH等寄存器可以看做独立的寄存器。
  • 一个字节为8bit,一个字节两个字。
  • 由于8086寄存器是16位,但是地址总线为20位,可以达到1m的寻址能力。故
    • CPU中相关的部件提供两个16位的地址,一个为段地址,一个为偏移地址,物理地址为段地址*16+偏移地址。
  • 段地址存放在段寄存器中,段寄存器根据不同的段又分为CS,DS,SS,ES段寄存器。
    • CS和IP是8086的两个关键的寄存器,他们指示了CPU当前要读取指令的地址。CS为段寄存器,IP为指令指针寄存器(也可以叫做指令偏移寄存器,我这么认为的)。IP寄存器不能通过mov等指令来修改,但是可以通过JMP指令来修改IP的值,例如:JMP AX;就是指将AX寄存器的值给IP寄存器。

寄存器(内存访问)

  • 8086内存中字的存储是用小端序,即高地址放高地址,低地址放低地址,如果有这样两个数据存储在内存中(4E20H和0012H)这里的H值该数据是16进制,A表示2进制,10什么也不跟。那么这两数据在寄存器中的存储为(20H,4EH,12H,00H)。字在内存中存储时,要用两个地址连续的内存单元来存放,字的低位字节存放在低地址单元,高位字节存放在高地址单元。

  • CPU要读写一个内存单元的时候,必须先给出这个内存单元的地址,在8086中存在一个DS段寄存器来存储数据段的段地址,用[]来表示间接寻址,比如

    1
    2
    3
    mov bx,1000H
    mov ds,bx;
    mov al,[0];

    因为不能对ds寄存器直接赋值,于是通过bx当桥梁来赋值,这段指令表示将10000H地址的一个字节的数据给al,因为al是一个字节,段地址为1000H,偏移地址为0H。

8086有两个寄存器,段寄存器SS和寄存器SP,栈顶的段地址存放在SS中,偏移地址存放在SP中,任意时刻SS:SP指向栈顶。

段的综述

我们可以将一段内存定义为一个段,用一个段地址指示段,用偏移地址访问段内的单元。

  • 我们可以用一个段存放数据,将他定义为”数据段”
  • 我们可以用一个段存放代码,将他定义为”代码段”
  • 我们可以用一个段存放栈,将他定义为”栈段”

对于数据段,将他的段地址放在DS中,用mov,add,sub等访问内存单元的指令时,CPU就将我们定义的数据段中的内容当做数据来访问。

对于代码段,将他的段地址放在CS中,将段中的第一条指令的偏移地址放在IP中,CPU就将执行我们定义的代码段中的指令。

对于栈段,将他的段地址放在SS中,将栈顶单元的偏移地址放在SP中,这样CPU在需要进行栈操作的时候,比如执行push,pop指令等,就将我们定义的栈段当做栈空间来用。