静态链接与重定位

以下述c代码为例,我们讨论一下重定位的过程

Read more »

ret2syscall

32位和64位进行系统调用时的区别

  1. 32位程序的函数调用用栈传参,使用 int 0x80 中断来进行系统调用
  2. 64位程序的函数调用前6个参数用寄存器传参,剩下的参数通过栈传参,使用 syscall 指令进行系统调用

Linux下64位的系统调用表格:参见博客

Read more »

配置环境

笔者选择在 Windows 11 中的 WSL2 中的 kali-linux 中安装 docker

Read more »

1.课程设计目的

  1. 熟悉各常用可编程接口芯片的工作原理、使用方法及引脚连接特性,正确操作实验设备,能根据设计要求制定总体方案,完成硬件连线,承担责任。
  2. 能够根据要求编写出满足功能要求的软件代码,能够利用开发工具进行设计调试、协助分析运行结果、定位设计错误等。
  3. 具有创新意识。尝试对所要求的功能设计提出有效的改进设想并努力实现;或尝试增加新的系统功能并努力实现。
  4. 具有对微机输入输出系统进行需求分析的能力,能针对具体的问题获取新知识完成系统的设计。
  5. 能够以口头和书面方式准确地描述、总结所完成的设计和主要成果,撰写比较规范的课程设计报告。
  6. 掌握综合控制键盘、数码管、步进电机的能力。
  7. 掌握有关中断服务程序的编制方法。
Read more »

单调栈

1
2
3
4
5
6
7
8
9
10
11
// 常见模型:找出每个数左/右边离它最近的比它大/小的数
// 以下代码是找到每个数左边第一个比它小的数
stack<int> stk;
for(int i = 0; i < n; i++)
{
cin >> a;
while(stk.size() && a <= stk.top()) stk.pop(); // 对于后面的数来说,a 比当前栈顶更优
if(stk.size()) cout << stk.top() << " ";
else cout << "-1 ";
stk.push(a);
}
Read more »

邻接表

建无向图的时候,add(a,b), add(b,a) ,所以每条边都是成对的,即编号 \((0,1)、(2,3)、(4,5) \dots\) 是一组 (正向边,反向边), 所以如果 \(i\) 是正向边,那么它的反向边就是 \(i \oplus 1\)

1
2
3
4
5
int h[N], e[M], w[M], ne[M], idx;
void add(int a, int b, int c)
{
e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx ++ ;
}
Read more »

线段树

基础知识

以查询区间最大值为例:
由分治的思想可知:区间 \([L,R]\) 的最大值等于 \(\max([L, M], [M + 1, R])\)
在区间 \([1,n]\) 上建线段树,以区间 \([1, 10]\) 为例,如图:

Read more »
0%