基础知识补充

NEMU and RTL design: 在src/isa/$ISA/inst.c中看如何一一对应
IFU = inst_fetch(&s->snpc,4) 取指
IDU = decode_exec(s) 解码
EXU = also in decode_exec(s), e.g. R(rd) = s->pc + imm where R(i) = gpr(i) 执行,读取与写入寄存器和内存
更新PC

退出的错误

Runtime Error: 如果返回值非 0 则表示命令执行出现错误。因此在命令正常退出 (如收到 q 命令后) 应当返回 0。一个不合适的方法是直接 exit 退出。合适的方式是正确地设置 nemu_state——直接退出可能导致部分逻辑未被执行。
NEMU初始化后调用engine_start in src/engine/interpreter/init.c, 退出于is_status_exit_bad in src/utils/state.c. 退出值描述: 正确的退出 = (NEMU_STOP)程序完成 | (NEMU_QUIT)cmd_q退出.
退出的错误是因为: cmd_q没有修改state直接返回(-1),使程序强制退出于错误的状态.

简易调试器(sdb)

命令 格式 使用举例 说明
帮助(1) help help 打印命令的帮助信息
继续运行(1) c c 继续运行被暂停的程序
退出(1) q q 退出NEMU
单步执行 si [N] si 10 让程序单步执行 N 条指令后暂停执行,当 N 没有给出时,缺省为 1
打印程序状态 info SUBCMD info r 打印寄存器状态
info w 打印监视点信息
扫描内存(2) x N EXPR x 10 $esp 求出表达式 EXPR 的值,将结果作为起始内存地址,以十六进制形式输出连续 N 个4字节
表达式求值 p EXPR p $eax + 1 求出表达式 EXPR 的值,EXPR 支持的运算请见调试中的表达式求值小节
设置监视点 w EXPR w *0x2000 当表达式 EXPR 的值发生变化时,暂停程序执行
删除监视点 d N d 2 删除序号为 N 的监视点

基础功能

表达式求值

正则表达式

形如/定位符 (匹配的字符) 定位符或限定符/修饰符. 包括了

思路

  1. 为什么要使用无符号类型? (建议二周目思考) 我们在表达式求值中约定, 所有运算都是无符号运算. 你知道为什么要这样约定吗? 如果进行有符号运算, 有可能会发生什么问题?
    表达式求值递归的每一次计算都是无符号运算; 应该把测试样例生成的数至少一部分设成unsigned类型, 否则测试样例只有最终一次求值是无符号数: 例如, 正确的结果为16/(-8) = 16/(2^32-8) = 0, 错误的结果为16/(-8) = -2 = 2^32-2;
  2. division by zero?
    除零会有warning; 在运行生成的程序时加入-Wall -Werror将warning转为error,程序运行出现error后退出不会输出这一行

长表达式结果不对?
分割测试(实际上也不会出现这么长的)

监视点

池是什么?事先创建对象保存在列表中,即取即用,用完归还,最后统一释放
监视点池存储所有监视点,链表分别接上used和free的监视点结构

需要完成的内容: