diff --git a/libr/core/cmd_anal.c b/libr/core/cmd_anal.c
index b6243521c4..3b1cd38fcd 100644
--- a/libr/core/cmd_anal.c
+++ b/libr/core/cmd_anal.c
@@ -580,7 +580,7 @@ static const char *help_msg_ah[] = {
"ahf", " 0x804840", "override fallback address for call",
"ahF", " 0x10", "set stackframe size at current offset",
"ahh", " 0x804840", "highlight this address offset in disasm",
- "ahi", "[?] 10", "define numeric base for immediates (2, 8, 10, 16, i, p, S, s)",
+ "ahi", "[?] 10", "define numeric base for immediates (2, 8, 10, 10u, 16, i, p, S, s)",
"ahj", "", "list hints in JSON",
"aho", " call", "change opcode type (see aho?) (deprecated, moved to \"ahd\")",
"ahp", " addr", "set pointer hint",
@@ -593,11 +593,12 @@ static const char *help_msg_ah[] = {
};
static const char *help_msg_ahi[] = {
- "Usage:", "ahi [2|8|10|16|bodhipSs] [@ offset]", " Define numeric base",
+ "Usage:", "ahi [2|8|10|10u|16|bodhipSs] [@ offset]", " Define numeric base",
"ahi", " ", "set numeric base (2, 8, 10, 16)",
+ "ahi", " 10|d", "set base to signed decimal (10), sign bit should depend on receiver size",
+ "ahi", " 10u|du", "set base to unsigned decimal (11)",
"ahi", " b", "set base to binary (2)",
"ahi", " o", "set base to octal (8)",
- "ahi", " d", "set base to decimal (10)",
"ahi", " h", "set base to hexadecimal (16)",
"ahi", " i", "set base to IP address (32)",
"ahi", " p", "set base to htons(port) (3)",
@@ -7615,16 +7616,20 @@ static void cmd_anal_hint(RCore *core, const char *input) {
}
if (input[1] == ' ') {
// You can either specify immbase with letters, or numbers
- const int base =
- (input[2] == 's') ? 1 :
- (input[2] == 'b') ? 2 :
- (input[2] == 'p') ? 3 :
- (input[2] == 'o') ? 8 :
- (input[2] == 'd') ? 10 :
- (input[2] == 'h') ? 16 :
- (input[2] == 'i') ? 32 : // ip address
- (input[2] == 'S') ? 80 : // syscall
- (int) r_num_math (core->num, input + 1);
+ int base;
+ if (r_str_startswith (input + 2, "10u") || r_str_startswith (input + 2, "du")) {
+ base = 11;
+ } else {
+ base = (input[2] == 's') ? 1 :
+ (input[2] == 'b') ? 2 :
+ (input[2] == 'p') ? 3 :
+ (input[2] == 'o') ? 8 :
+ (input[2] == 'd') ? 10 :
+ (input[2] == 'h') ? 16 :
+ (input[2] == 'i') ? 32 : // ip address
+ (input[2] == 'S') ? 80 : // syscall
+ (int) r_num_math (core->num, input + 1);
+ }
r_anal_hint_set_immbase (core->anal, core->offset, base);
} else if (input[1] != '?' && input[1] != '-') {
eprintf ("|ERROR| Usage: ahi \n");
diff --git a/libr/parse/filter.c b/libr/parse/filter.c
index 8b1bd232b4..5f08fae823 100644
--- a/libr/parse/filter.c
+++ b/libr/parse/filter.c
@@ -479,7 +479,26 @@ static bool filter(RParse *p, ut64 addr, RFlag *f, RAnalHint *hint, char *data,
snprintf (num, sizeof (num), "0%o", (int)off);
break;
case 10:
- snprintf (num, sizeof (num), "%" PFMT64d, (st64)off);
+ {
+ RList *regs = r_reg_get_list (p->analb.anal->reg, R_REG_TYPE_GPR);
+ RRegItem *reg;
+ RListIter *iter;
+ bool imm32 = false;
+ r_list_foreach (regs, iter, reg) {
+ if (reg->size == 32 && r_str_casestr (data, reg->name)) {
+ imm32 = true;
+ break;
+ }
+ }
+ if (imm32) {
+ snprintf (num, sizeof (num), "%"PFMT32d, (st32)off);
+ break;
+ }
+ snprintf (num, sizeof (num), "%"PFMT64d, (st64)off);
+ }
+ break;
+ case 11:
+ snprintf (num, sizeof (num), "%"PFMT64u, off);
break;
case 32:
{
diff --git a/test/db/cmd/cmd_ahi b/test/db/cmd/cmd_ahi
index 879eca9c4a..3ecf4343e6 100644
--- a/test/db/cmd/cmd_ahi
+++ b/test/db/cmd/cmd_ahi
@@ -357,3 +357,53 @@ EXPECT=<