mem之读操作调式总结(跟入栈出栈有关)

现象:

1.当case比较复杂的时候(含有for循环对mem进行读/写)

发现for循环时总是有汇编指令不执行跳过去了,(其实是汇编不熟和指令太多无法理智分析指令了)。

事实是指令是对的,但执行错了(所以debug时一定要保证不改变问题本质的情况下尽量简化case,编译出最简单的指令序列,方便分析指令序列背后的原理,否则就无法定位编译是否有错误)。

2.当case比较简单的时候(仅仅对若干个mem地址写操作)

发现地址跟数据对不上,系统并未按指定地址写入指定值。但地址、数据都不少。直觉告诉我,stack的push /pop 乱了,并未遵循先进先出的规则。

栈也是对memory读写操作,只不过一系列的读写操作有特别的意义(在一块固定的memory空间上)。

 之后重点关注了栈中读写单元的操作,通过观察systembus上数据操作。发现systembus上的数据也不对,卧槽。

此时怀疑1.编译本身就错了。(不过太可能,如果流程错了但以前是对了。而且可以通过分析指令序列看看,分析简单的指令序列也是有必要的,有时候。)

2.memory 接口做错了。发现接口错了。

重要的提示:

1.push/pop也是对memory空间读写操作。

2.一定要知道那种现象是对的,否则错了也不知道。

3.多查看接口,不要过于深入模块内部追信号。

4.对系统抽象数据流要非常熟悉。

  5.尽量简化系统简化代码,方便分析定位问题。

6.通过制造错误,分析现象验证猜测。

  7.尽量隔离问题,不要让模块的问题扩散到系统级,否则很小的bug到系统就会隐藏的很深,不易定位。

时间: 2024-12-11 21:09:58

mem之读操作调式总结(跟入栈出栈有关)的相关文章

BZOJ 3786 星系探索 Splay维护树的入栈出栈序

题目大意:给出一棵树,要求有以下这些操作:1.求出一个节点到根的点权和.2.将一个节点的父亲改变.3.将一个子树中的每一个节点都加上一个权值. 思路:LCT就不用想了,因为有子树操作.然后就是一个很神奇的东西了,就是Splay维护树的入栈出栈序.这个玩应是做了这个题之后才知道的.但是感觉真的很dio. 首先,我们先按照题意,将树建出来.然后从根开始深搜,这样一个点进入DFS函数和出DFS函数的时候就会有两个时间点,就是入栈的时间和出栈的时间.然后利用Splay维护一个序列,就是入栈出栈的顺序.在

Python模拟入栈出栈操作

目标: 1.编写菜单,提示用户操作选项(push,pop,view,quit) 2.规则:定义列表,先入栈,后出栈,后入栈,先出栈 1.模拟入栈.出栈操作 >>> list1 = [] >>> list1.append('a') >>> list1 ['a'] >>> list1.append('b') >>> list1 ['a', 'b'] >>> list1.pop() 'b' >>

栈的链式存储结构和入栈出栈操作

参考<大话数据结构>P98~99——栈的链式存储结构. 进栈: 出栈: 举个简单的例子: 代码和解释如下(VS2012测试通过): 1 #include <iostream> 2 #include <string> 3 using namespace std; 4 5 typedef string status;//用书上推荐的status返回是否成功,C++中的模板类string比字符数组char[]更方便 6 7 //栈的结点 8 //包含data,和指向下一个结点

两栈共享空间的存储结构和入栈出栈操作

参考<大话数据结构>P95~96——两栈共享存储空间. 当两个栈的需求空间有相反关系时,也就是一个栈增长时,另一个栈在缩短,可以采用两栈共享空间结构.这是针对两个具有相同数据类型的栈的一个设计技巧. 举个简单的例子: 代码和解释如下(VS2012测试通过): 1 #include <iostream> 2 #include <string> 3 using namespace std; 4 5 #define MAXSIZE 6 //本例中栈满共6个元素 6 typed

编程实现栈的入栈/出栈操作

完整代码如下,其实队栈都只是链表的一种变化而已 #include <stdio.h> #include <stdlib.h> typedef struct student * PNode; typedef struct stacklink * PStack; typedef struct student { int data; PNode next; }Node; typedef struct stacklink { PNode zhandi; PNode top; }Stack;

2.1.1线性表实现栈的建立,入栈,出栈等操作

#include <stdio.h> #include <stdlib.h> #define STACK_INIT_SIZE 100 #define STACK_INCREMENT 10 #define OK 1 #define ERROR 0 #define OVERFLOW -1 typedef int status; typedef int SElemType; typedef struct { SElemType *base;//在构造之前和销毁之后,base的值为NULL

入栈/出栈

栈的push/pop操作 #include<iostream> #include<vector> using namespace std; struct node { int data; node *next; }; struct stack_queue { node *bottom; node *top; }; //入栈 stack_queue *push_stack(stack_queue *ST, int num) { //stack_queue *s=new stack_q

栈、堆内存到底是如何申请的,方法是如何入栈出栈的——内存结构理解学习

Lee出品,转载请注明出处http://blog.csdn.net/hnulwt/article/details/42934365 对于软件开发者而言,理解和熟悉计算机内存知识是很基础的.今天我就来翻翻旧账,回顾看看有哪些点遗漏了,在此共同学习. 提起内存,我们常常想到三个区域: 1,静态区,静态变量 static variables / constant  ,常量,静态变量就存储在静态区域,这个区域比较简单,只需要知道怎么通过地址访问他就行了. 2,堆,也叫堆栈(这里要注意堆栈 和 栈 是不同

23 入栈 出栈

分析下列程序输出:string int main() { StackS; char x,y; Initstack(S); x='n';y='g'; Push(S,x);Push(S,'i');Push(S,y); Pop(S,x);Push(S,'r');Push(S,'t');Push(S,x); Pop(S,x);Push(S,' s'); while(!StackEmpty(S)) { Pop(S,y);printf(y); }; Printf(x); } 分析:看完如下的结果即可.补充一