x86 NEMU PA1
NEMU PA1
https://nju-projectn.github.io/ics-pa-gitbook/ics2020/PA1.html
没用bash,用的fish
export NEMU_HOME=/mnt/hgfs/share/ics2020/nemu |
abstruct machine 里change SIGSTKSZ to 8192
vscode 配置c_cpp_properties.json里一些预编译,来配置解析选项解锁正确的代码解析
可以用make -nB查看一下项目里原本定义的预编译宏
- -n 仅显示将要执行的命令,而不实际执行它们。
- -B 表示 “always-make”,它告诉 make 忽略时间戳检查,强制重新构建目标文件
grxer@Ubuntu22 /m/h/s/i/nemu (pa1)> make ARCH=x86-nemu ALL=dummy run -nB |
//c_cpp_properties.json |
额,后来用了clangd做解析。。。。 bear –make自动生成数据库,好用尼
或者,下面这个好像是专门给makefile用的
pip install compiledb |
开始pa之旅:)
寄存器结构体
利用匿名union和匿名struct去写
typedef struct { |
关于assert实现与封装
上面写法在一些特殊情况是有问题的
if (...) assert(xxx); // 上面的assert对么? |
assert展开后下面的else会被宏里的if吸收,所以我们吸收后面的if是一个整体
nemu里采用了下面的写法
GNU提供C语言扩展({ ... })
来吧这个语句当作整体,但这不是c标准
去看了一下glibc2.35的源码,依旧存在#define assert(cond) if (!(cond)) panic(...);
的写法,但是基本上后面都没有else,但或许是个隐患
info r
static int cmd_info(char *args) { |
si N
static int cmd_si(char *args) { |
x N EXPR
static int cmd_x(char *args) { |
p 表示式求值
enum { |
/* TODO: Now a new token is recognized with rules[i]. Add codes |
//检测是否被括号包围 |
static int cmd_p(char *args) { |
监视点
typedef struct watchpoint { |
void init_wp_pool() { |
static int cmd_w(char *args) { |
cpu-exec.c
|
info w
static int cmd_info(char *args) { |
d NUM
static int cmd_d(char *args) { |
调试器所有command
static struct { |