《汇编语言》笔记(1)

时间:2021-04-08 04:49:40

    说好的学汇编开始了。笔记走起~

    本书的环境都是8086,8086有14个16位寄存器,有20位地址总线,寻址能力1MB。16位数据总线。

    汇编语言主要是一系列汇编指令,汇编指令就是将机器码变成了人便于记忆的指令,与01相比,mov,loop更直观。除了汇编指令,汇编语言还包括了伪指令(没有对应的机器码,由编译器执行),其他符号(如+,-,×,/由编译器识别)。

   汇编主要是通过控制CPU完成对寄存器,内存的操作。

    一个小例子,mov ax,0123H 将0123H赋给ax寄存器,ax中保存的内容即为)0123H。

    寄存器AX,BX,CX,DX用来存放一般性的数据,称为通用寄存器。

    寄存器CS(Code Segment 代码段寄存器) IP(Instruction Pointer 指令指针寄存器),首先我们需要知道CPU是如何访问内存执行指令的,首先由两个16位的地址,一个是段地址,一个是偏移地址,经过地址加法器,合成一个20位的物理地址,这20位地址再经过地址总线找到物理地址。地址加法器是按照 段地址x16+偏移地址 来计算物理地址的。 

    而CS中存储的就是段地址,IP就是偏移地址。所以8086CPU的工作流程就是首先从CS:IP所指向的内存单元读取指令,将读取的指令放入指令缓冲器,再将IP加上此次读取的指令,使其指向下一条指令,最后,执行已经读取的指令。注意是IP先增加指向下一条指令,再执行指令。

    若想修改CS IP的值,须使用jmp 指令(8086不支持将数据直接放入段寄存器)。同时修改 CS IP 可以 jmp 段地址:偏移地址 用给出的段地址和偏移地址赋给CS IP 例如 jmp 3:0B16 则 执行后CS为 0003H IP为 0B16H。 只修改IP 也可以用 jmp 寄存器 如jmp ax 就是将ax中的内容赋给IP。

    寄存器DS(Data Segment 数据段寄存器)也是一个段寄存器,与CS记录指令的段地址不同,它记录的是数据的段地址。当我们想要将内存中的数据放入寄存器,可以用mov ax,[0] 此时放入的数据就是内存中 DS(段地址)+ 0 (偏移地址)中的内容 。

    寄存器SS(Stack Segment:堆栈段寄存器),SP(Stack Pointer:堆栈指针寄存器)与CS IP类似,可以得到栈顶元素的位置。8086CPU提供push pop来以栈的方式访问内存空间。而入栈和出栈操作都是以字为单位的,例如 push ax  将ax元素压入栈,则 首先SP = SP -2  SS:SP指向当前栈顶前面的元素,即新栈顶,然后将ax中的元素放入新栈顶。pop ax 将栈顶元素出栈存入ax,首先将SS:SP指向的元素放入ax,再将SP + 2 指向新栈顶。

    8086不保证我们对栈的操作不会超界(栈满继续入栈,栈空继续出栈),它只知道栈顶元素在哪,却不知道栈的空间有多大。

    通过段,我们可以自己定义一部分内存空间作为一个段,让CPU按照我们的安排访问这些段,CPU只知道CS IP指向的是指令,将那里当做代码,知道CPU的工作原理才能让CPU按照我们的安排工作。