From ce18d37bb356a347b7910028a0f599aa2e526aa6 Mon Sep 17 00:00:00 2001
From: Recolic Keghart <root@recolic.net>
Date: Wed, 1 Jan 2020 18:49:09 -0800
Subject: [PATCH] Debugger adapt doc

---
 nemu/include/monitor/watchpoint.h        | 2 +-
 nemu/src/monitor/debug/expr_impl/lexer.l | 3 ++-
 nemu/src/monitor/debug/ui.cc             | 3 ++-
 3 files changed, 5 insertions(+), 3 deletions(-)

diff --git a/nemu/include/monitor/watchpoint.h b/nemu/include/monitor/watchpoint.h
index 7d4c0e5..a105199 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 851781d..108a9f3 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 7315849..2332389 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;
-- 
GitLab