diff --git a/nemu/include/monitor/watchpoint.h b/nemu/include/monitor/watchpoint.h index 7d4c0e5e061eb64da051e2cc83d1fb26c5a9d878..a105199ae5048285097cdbd28c5e697bedeb3082 100644 --- a/nemu/include/monitor/watchpoint.h +++ b/nemu/include/monitor/watchpoint.h @@ -17,7 +17,7 @@ struct WP { bool evalulate() { auto new_value = evaluate_expr(expr); std::swap(new_value, curr_value); - return new_value != curr_value; + return new_value != curr_value && curr_value != 0; } WP(std::string e, int id) : expr(e), id(id) { evalulate(); // initial expr value. diff --git a/nemu/src/monitor/debug/expr_impl/lexer.l b/nemu/src/monitor/debug/expr_impl/lexer.l index 851781d09a0703631b37e37bf87ece900272e0b1..108a9f39c9b76dadf758b2e39829b18258075424 100644 --- a/nemu/src/monitor/debug/expr_impl/lexer.l +++ b/nemu/src/monitor/debug/expr_impl/lexer.l @@ -13,7 +13,7 @@ %% [ \t\n] {} -0x[0-9a-f]+ {yylval.ival = (int)strtol(yytext, NULL, 16); return T_INT;} +0[xX][0-9a-f]+ {yylval.ival = (int)strtol(yytext, NULL, 16); return T_INT;} [0-9]+ {yylval.ival = atoi(yytext); return T_INT;} "==" {return T_EQUAL;} "!=" {return T_NEQUAL;} @@ -21,6 +21,7 @@ [-+*/()] {return yytext[0];} "%"[a-z]{3} {yylval.ival = ((uint32_t)yytext[2] << 8) + yytext[3]; return T_REG;} +"$"[a-z]{3} {yylval.ival = ((uint32_t)yytext[2] << 8) + yytext[3]; return T_REG;} . {throw std::runtime_error(std::string("lexer error around token: ") + yytext);} %% // Registers: eax='a'+'x', ebx='b'+'x', ... diff --git a/nemu/src/monitor/debug/ui.cc b/nemu/src/monitor/debug/ui.cc index 73158491ea81cd766308441595894f4f9b986275..2332389eab03c5e8fbbc176b62c5be8e3a89f695 100644 --- a/nemu/src/monitor/debug/ui.cc +++ b/nemu/src/monitor/debug/ui.cc @@ -70,6 +70,7 @@ static struct { { "help", "Display informations about all supported commands", cmd_help }, { "c", "Continue the execution of the program", cmd_c }, { "n", "= GDB `n`", cmd_n }, + { "si", "= GDB `n`", cmd_n }, { "info", "= GDB `info`, supporting `info r` / `info w`", cmd_info }, { "x", "x <bytes> <startAddr or expr>, dump memory content.", cmd_x }, { "w", "w <expr>, add watchpoint for $expr", cmd_w }, @@ -201,7 +202,7 @@ static int cmd_w(char *_args) { if(_args == NULL) throw std::invalid_argument("w <expr>"); - watchpoints.emplace_front(std::string(_args), ++max_watchpoint_id); + watchpoints.emplace_front(std::string(_args), max_watchpoint_id++); auto iter = watchpoints.begin(); // not thread-safe. rlib::println("Add watchpoint:", *iter); return 0;