Update the capstone-x86-unsigned patch

This commit is contained in:
pancake 2017-06-15 10:04:57 +02:00
parent b3ee74dacd
commit 0b4eb1740c
3 changed files with 80 additions and 18 deletions

View file

@ -56,6 +56,9 @@ static int disassemble(RAsm *a, RAsmOp *op, const ut8 *buf, int len) {
} else {
cs_option (cd, CS_OPT_DETAIL, CS_OPT_OFF);
}
// always unsigned immediates (kernel addresses)
// maybe r2 should have an option for this too?
cs_option (cd, CS_OPT_UNSIGNED, CS_OPT_ON);
if (a->syntax == R_ASM_SYNTAX_MASM) {
#if CS_API_MAJOR >= 4
cs_option (cd, CS_OPT_SYNTAX, CS_OPT_SYNTAX_MASM);

View file

@ -0,0 +1,77 @@
commit e0f1649e528269c2c99412cf7c64922ec8fd3f5e
Author: pancake <pancake@nopcode.org>
Date: Thu Jun 15 09:36:09 2017 +0200
Honor CS_OPT_UNSIGNED on x86 and add cstool -u
diff --git a/arch/X86/X86IntelInstPrinter.c b/arch/X86/X86IntelInstPrinter.c
index 5ea5835d..25ba93ed 100644
--- a/arch/X86/X86IntelInstPrinter.c
+++ b/arch/X86/X86IntelInstPrinter.c
@@ -444,7 +444,7 @@ static void _printOperand(MCInst *MI, unsigned OpNo, SStream *O)
printRegName(O, MCOperand_getReg(Op));
} else if (MCOperand_isImm(Op)) {
int64_t imm = MCOperand_getImm(Op);
- printImm(MI->csh->syntax, O, imm, false);
+ printImm(MI->csh->syntax, O, imm, MI->csh->imm_unsigned);
}
}
@@ -887,7 +887,7 @@ static void printOperand(MCInst *MI, unsigned OpNo, SStream *O)
// printf(">>> id = %u\n", MI->flat_insn->id);
switch(MI->flat_insn->id) {
default:
- printImm(MI->csh->syntax, O, imm, false);
+ printImm(MI->csh->syntax, O, imm, MI->csh->imm_unsigned);
break;
case X86_INS_MOVABS:
diff --git a/cstool/cstool.c b/cstool/cstool.c
index ef88ccb9..ca430c32 100644
--- a/cstool/cstool.c
+++ b/cstool/cstool.c
@@ -72,7 +72,7 @@ static uint8_t *preprocess(char *code, size_t *size)
static void usage(char *prog)
{
printf("Cstool for Capstone Disassembler Engine v%u.%u.%u\n\n", CS_VERSION_MAJOR, CS_VERSION_MINOR, CS_VERSION_EXTRA);
- printf("Syntax: %s [-d] <arch+mode> <assembly-hexstring> [start-address-in-hex-format]\n", prog);
+ printf("Syntax: %s [-u|-d] <arch+mode> <assembly-hexstring> [start-address-in-hex-format]\n", prog);
printf("\nThe following <arch+mode> options are supported:\n");
if (cs_support(CS_ARCH_X86)) {
@@ -144,18 +144,23 @@ int main(int argc, char **argv)
cs_mode md;
cs_arch arch;
bool detail_flag = false;
+ bool unsigned_flag = false;
if (argc != 3 && argc != 4 && argc != 5) {
usage(argv[0]);
return -1;
}
- if (!strcmp(argv[1], "-d")) {
+ if (!strcmp(argv[1], "-d") || !strcmp(argv[1], "-u")) {
if (argc == 3) {
usage(argv[0]);
return -1;
}
- detail_flag = true;
+ if (argv[1][1] == 'd') {
+ detail_flag = true;
+ } else {
+ unsigned_flag = true;
+ }
mode = argv[2];
assembly = preprocess(argv[3], &size);
if (argc == 5) {
@@ -345,6 +350,9 @@ int main(int argc, char **argv)
if (detail_flag) {
cs_option(handle, CS_OPT_DETAIL, CS_OPT_ON);
}
+ if (unsigned_flag) {
+ cs_option(handle, CS_OPT_UNSIGNED, CS_OPT_ON);
+ }
count = cs_disasm(handle, assembly, size, address, 0, &insn);
if (count > 0) {

View file

@ -1,18 +0,0 @@
diff --git a/arch/X86/X86IntelInstPrinter.c b/arch/X86/X86IntelInstPrinter.c
index 57778a7..ad62378 100644
--- a/arch/X86/X86IntelInstPrinter.c
+++ b/arch/X86/X86IntelInstPrinter.c
@@ -421,11 +421,8 @@ static void printImm(int syntax, SStream *O, int64_t imm, bool positive)
if (imm < 0) {
if (imm == 0x8000000000000000LL) // imm == -imm
SStream_concat0(O, "0x8000000000000000");
- else if (imm < -HEX_THRESHOLD)
- SStream_concat(O, "-0x%"PRIx64, -imm);
- else
- SStream_concat(O, "-%"PRIu64, -imm);
-
+ else
+ SStream_concat(O, "0x%"PRIx64, imm);
} else {
if (imm > HEX_THRESHOLD)
SStream_concat(O, "0x%"PRIx64, imm);