通用寄存器
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进来向栈顶方向走
注:栈为空的时候,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字节
2020年11月29日 20:58
你这个源码有点被挡住了