物理地址=段地址*16+偏移地址
他们揭示了cpu当前要读取指令的地址
AX/BX/CX/DX,被称为数据寄存器这四个都可以独立拆分成两个8位寄存器
分为AH和AL
基地址寄存器
分为BH和BL
计数器寄存器
分为CH和CL
数据寄存器
分为DH和DL
基指针寄存器
堆栈指针寄存器
目的变址寄存器
源变址寄存器
指令指针寄存器
程序状态字(标志值寄存器)
代码段寄存器
堆栈段寄存器
数据段寄存器
附加段寄存器

1.初始状态(CS:2000H,IP:0000H,),cpu执行从内存中读取(2000H*16+0000H)
2.cs、ip中内容送入地址加法器(地址加法器:物理地址=段地址*16+偏移地址)
3.地址加法器将物理地址送入输入输出的控制电路
4.控制电路将得到的20000H(16进制容易让人误解,初学不要管计算机内部计算的事)送上20位地址总线
5.从内存20000H单元开始存放的机械指令B82301(这个和汇编指令控制了3个内存单元有关系)通过数据总部现被送回cpu
6.控制电路降脂灵送入指令缓存器
7.执行控制器接收,并使ip增加对应内存单元使用数以表示运行成功
参考文章数据结构——栈的详解_AC-fun的博客-CSDN博客_数据结构栈
栈是限定仅仅在表尾进行插入或删除的线性表,对于栈来说,表尾(栈顶)top,表头称为栈低。不含元素称为空栈。因为栈限定在表尾进行插入或者删除,所以栈又被称为后进先出的线性表(简称LIFO:Last in, First out.结构)

栈的基本操作主要有:栈的初始化\判空\判满取栈\在栈顶进行插入和删除。其中在栈顶插入元素称为入栈,在栈顶删除元素称为出栈
栈和线性表类似,也有两种存储表示方法顺序栈和链栈
链栈的操作性表操作的特例,操作比较容易实现;顺序栈利用一组地址将连续存储单元依次存放自栈底到栈顶的数据元素。同时设置指针top指示栈顶元素在顺序栈中的位置,top=0表示空栈。
由于栈在使用过程中所需要的大小难以估计没所以通常是先为栈分配一个基本容量,然后再使用过程中,当栈的空间不够使用的时候再继续追加空间
当我们弹出栈顶元素时,往往需要判断一下栈是否为空来防止发生下溢。通常可用==base作为栈底指针,它始终指向栈底,所以s.top=s.base可以作为栈空的标记。所以我们可以这样判断栈是否为空
//判断是否为空栈 void judgeNull(SqStack &s){ if(s.top == s.base){ printf("此栈为空栈!\n"); }else{ printf("此栈不为空栈!\n"); } }
判断是否为满栈
当我们使一个元素入栈之前,我们需要判断一下是否为满栈,防止发生上溢。我们定义一个stacksize来表示当前已经分配的存储空间,所以我们可以用s.top-s.base 来算出当前已经使用的栈空间,所以当s.top - s.base == s.StackSize时表示已经满栈:
首先判断是否为空栈
//出栈
Status Pop(SqStack &s,SDataType &e){
//判断是否会发生下溢
if(s.top != s.base){
s.top--; //先将栈顶指针减 1
e = *(s.top);
}else{
return 0;
}
return e;
}
识别代码类型怎么弄的?