From 25a52d7fcad91e4f427985fa02f3af306f740f7d Mon Sep 17 00:00:00 2001 From: tracer-ysyx Date: Thu, 11 Jan 2024 18:12:27 +0800 Subject: [PATCH] =?UTF-8?q?>=20compile=20NEMU=20ysyx=5F22040000=20?= =?UTF-8?q?=E6=9D=8E=E5=BF=83=E6=9D=A8=20Linux=20calcite=206.1.69=20#1-Nix?= =?UTF-8?q?OS=20SMP=20PREEMPT=5FDYNAMIC=20Wed=20Dec=2020=2016:00:29=20UTC?= =?UTF-8?q?=202023=20x86=5F64=20GNU/Linux=20=2018:12:27=20=20up=203=20days?= =?UTF-8?q?=2017:13,=20=202=20users,=20=20load=20average:=201.49,=200.98,?= =?UTF-8?q?=200.75?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- nemu/src/monitor/sdb/sdb.c | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/nemu/src/monitor/sdb/sdb.c b/nemu/src/monitor/sdb/sdb.c index d1b57c7..6759c3f 100644 --- a/nemu/src/monitor/sdb/sdb.c +++ b/nemu/src/monitor/sdb/sdb.c @@ -17,7 +17,6 @@ #include #include #include -#include #include "sdb.h" static int is_batch_mode = false; @@ -54,8 +53,31 @@ static int cmd_q(char *args) { return -1; } +/* Single stepping + * : execute step + */ static int cmd_si(char *args) { - printf("%s", args); + char *arg = strtok(args, " "); + if (arg == NULL) { + cpu_exec(1); + } else { + int base = 10; + int length = strlen(arg); + if (length > 2) { + if (arg[0] == '0' && (arg[1] == 'b' || arg[1] == 'B')) { + base = 2; arg = arg + 2; + } else if (arg[0] == '0' && (arg[1] == 'x' || arg[1] == 'X')) { + base = 16; arg = arg + 2; + } + } + int n = strtoumax(arg, NULL, base); + if (n == UINTMAX_MAX) { + printf("Invalid argument for command si: %s\n", args); + return 0; + } else { + cpu_exec(n); + } + } return 0; } @@ -70,9 +92,6 @@ static struct { { "c", "Continue the execution of the program", cmd_c }, { "q", "Exit NEMU", cmd_q }, { "si", "Single step [n] step", cmd_si }, - - /* TODO: Add more commands */ - }; #define NR_CMD ARRLEN(cmd_table)