汇编语言寄存器重点笔记

首页 / 电子 / 正文

通用寄存器

8086CPU有14个寄存器,分别是AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW

  • 数据寄存器

    AX:Accumulator 累加
    BX:Base 基址
    CX:Count 计数
    DX:Data 数据

  • 指针寄存器(Pointer——指针)

    SP:Stack 堆栈指针
    BP:Base 基指针

  • 变址寄存器(Index——索引)

    SI:Source 源变址
    DI:Destination 目的变址

  • 控制寄存器(控制指令)

    IP:Instruction Pointer 指令指针(指令不可直接访问,控制指令执行位置)
    FLAG:标志寄存器

  • 段寄存器(Segment)

    CS:Code 代码段——从中可读出放代码的地方在哪
    DS:Data 数据段——从中可读出放数据的地方在哪
    SS:Stack 堆栈段——从中可读出放堆栈的地方在哪
    ES:Extra 附加段——从中可读出附加段的地方在哪

    零散芝士

  • 十六进制表示:0x开头或H结尾
  • []表示取括号内地址处的值,这里的地址是偏移地址
  • L低位,H高位,16位cpu内部的寄存器可通过高低位支持8位程序,比如可以用AL、AH这样表示8位寄存器
  • 段地址就是这个段开头所在的地址,偏移地址就是从开头向后偏移多少的位置
  • 段地址 + 偏移地址拼起来 = 物理地址,具体计算就是段地址左移4位再加上偏移地址,也就是段地址乘16
  • 程序执行的时候,程序段所在的地址存在CS(代码段寄存器)里,偏移地址存在IP里,表示程序运行到哪句,IP里的值会自动增加,让语句一条一条执行

几条汇编指令

MOV

MOV ax,18     ;将18写进ax寄存器

ADD

ADD ax,18     ;将18加到ax寄存器

ADD

ADD ax,18     ;将ax寄存器里的东西减掉18

JMP

JMP 2AE3:0003      ;跳转到段地址2AE3,偏移地址0003处取出语句执行
;JMP会更改CS寄存器和IP寄存器的值以达到跳转的目的

SS(Stack Segment)

SS是存放这个堆栈段所在的地址的一个段寄存器,表示的是栈顶

注意,不可直接把数据写入SS这个寄存器!只能用其他寄存器(如ax)中转

;示例:
;正确写法
MOV ax,1000H
MOV ss,ax        

;错误写法
MOV ss,1000H

SP(Stack Pointer)

SP是这个栈内游标所在的位置,从栈底下面一个单元开始,随着元素push进来向栈顶方向走
无标题5.jpg

注:栈为空的时候,SP指针指向的是栈底下面的单元,在PUSH指令作用后,SP指针将上移一个单元

通过对SS和SP赋值,可确定栈顶和栈底所在的地址,由此确定一个栈

由此可推理出,给SP赋予的初始值实际上是整个栈的大小,比如要用16个字节,10000H~1000FH里面定义一个栈,也就是1000里的 0~F,那么SS就要赋值1000H,SP就赋值16字节,也就是0010H

PUSH

PUSH 16    ;将16入栈
PUSH ax    ;将ax里的数据入栈

POP

POP ax    ;出一个栈顶元素,放进ax里

综合示例

mov ax,0056H ;栈顶在0056H处
mov ss,ax

mov sp, 0080H ;16*8=128字节
打赏
评论区
头像
    头像
    fancy
    2020年11月29日 20:58
    回复

    你这个源码有点被挡住了