diff options
author | Ruslan Kabatsayev <b7.10110111@gmail.com> | 2017-02-12 19:31:19 +0300 |
---|---|---|
committer | Cyrill Gorcunov <gorcunov@gmail.com> | 2017-02-12 20:19:34 +0300 |
commit | 3ebed50146d28ec0ae1eeb16fb951bf75d11b3bd (patch) | |
tree | 84b6d074a338792711723bee8c9e782e3d7f2ab8 | |
parent | a92a7dce5ed61d482c549abc3c1ef144025ec2ae (diff) | |
download | nasm-3ebed50146d28ec0ae1eeb16fb951bf75d11b3bd.tar.gz |
disasm: Add support for 64-bit origin
This fixes disassembly of instructions like jmp/call when target address
is larger than 2^32-1, and also printing of current address when it's
large.
After this change ndisasm still assumes that the files to disassemble
will never reach 4GiB: only offsets are made 64 bit, but not lengths.
https://bugzilla.nasm.us/show_bug.cgi?id=3392349
Signed-off-by: Ruslan Kabatsayev <b7.10110111@gmail.com>
Signed-off-by: Cyrill Gorcunov <gorcunov@gmail.com>
-rw-r--r-- | disasm/disasm.c | 4 | ||||
-rw-r--r-- | disasm/disasm.h | 2 | ||||
-rw-r--r-- | disasm/ndisasm.c | 10 | ||||
-rw-r--r-- | disasm/sync.c | 6 | ||||
-rw-r--r-- | disasm/sync.h | 4 |
5 files changed, 13 insertions, 13 deletions
diff --git a/disasm/disasm.c b/disasm/disasm.c index 822c520c..a75d839e 100644 --- a/disasm/disasm.c +++ b/disasm/disasm.c @@ -1109,7 +1109,7 @@ static const char * const condition_name[16] = { }; int32_t disasm(uint8_t *data, char *output, int outbufsize, int segsize, - int32_t offset, int autosync, iflag_t *prefer) + int64_t offset, int autosync, iflag_t *prefer) { const struct itemplate * const *p, * const *best_p; const struct disasm_index *ix; @@ -1591,7 +1591,7 @@ int32_t disasm(uint8_t *data, char *output, int outbufsize, int segsize, } else if (o->segment & SEG_DISP32) { if (prefix.asize == 64) { const char *prefix; - uint64_t offset = (int64_t)(int32_t)offs; + uint64_t offset = offs; if ((int32_t)offs < 0 && started) { offset = -offset; prefix = "-"; diff --git a/disasm/disasm.h b/disasm/disasm.h index fa6e2e2f..6c89293e 100644 --- a/disasm/disasm.h +++ b/disasm/disasm.h @@ -43,7 +43,7 @@ #define INSN_MAX 32 /* one instruction can't be longer than this */ int32_t disasm(uint8_t *data, char *output, int outbufsize, int segsize, - int32_t offset, int autosync, iflag_t *prefer); + int64_t offset, int autosync, iflag_t *prefer); int32_t eatbyte(uint8_t *data, char *output, int outbufsize, int segsize); #endif diff --git a/disasm/ndisasm.c b/disasm/ndisasm.c index d90b5c3b..328a02f0 100644 --- a/disasm/ndisasm.c +++ b/disasm/ndisasm.c @@ -65,7 +65,7 @@ static const char *help = " -k avoids disassembling <bytes> bytes from position <start>\n" " -p selects the preferred vendor instruction set (intel, amd, cyrix, idt)\n"; -static void output_ins(uint32_t, uint8_t *, int, char *); +static void output_ins(uint64_t, uint8_t *, int, char *); static void skip(uint32_t dist, FILE * fp); static void ndisasm_verror(int severity, const char *fmt, va_list va) @@ -90,7 +90,7 @@ int main(int argc, char **argv) bool eof = false; iflag_t prefer; bool rn_error; - int32_t offset; + int64_t offset; FILE *fp; tolower_init(); @@ -306,7 +306,7 @@ int main(int argc, char **argv) if ((nextsync || synclen) && (uint32_t)offset == nextsync) { if (synclen) { - fprintf(stdout, "%08"PRIX32" skipping 0x%"PRIX32" bytes\n", + fprintf(stdout, "%08"PRIX64" skipping 0x%"PRIX32" bytes\n", offset, synclen); offset += synclen; skip(synclen, fp); @@ -342,11 +342,11 @@ int main(int argc, char **argv) return 0; } -static void output_ins(uint32_t offset, uint8_t *data, +static void output_ins(uint64_t offset, uint8_t *data, int datalen, char *insn) { int bytes; - fprintf(stdout, "%08"PRIX32" ", offset); + fprintf(stdout, "%08"PRIX64" ", offset); bytes = 0; while (datalen > 0 && bytes < BPL) { diff --git a/disasm/sync.c b/disasm/sync.c index 5c703b0b..7116b229 100644 --- a/disasm/sync.c +++ b/disasm/sync.c @@ -56,7 +56,7 @@ */ static struct Sync { - uint32_t pos; + uint64_t pos; uint32_t length; } *synx; @@ -76,7 +76,7 @@ void init_sync(void) nsynx = 0; } -void add_sync(uint32_t pos, uint32_t length) +void add_sync(uint64_t pos, uint32_t length) { uint32_t i; @@ -97,7 +97,7 @@ void add_sync(uint32_t pos, uint32_t length) } } -uint32_t next_sync(uint32_t position, uint32_t *length) +uint64_t next_sync(uint64_t position, uint32_t *length) { while (nsynx > 0 && synx[1].pos + synx[1].length <= position) { uint32_t i, j; diff --git a/disasm/sync.h b/disasm/sync.h index 27d8e8b8..15c5afdf 100644 --- a/disasm/sync.h +++ b/disasm/sync.h @@ -39,7 +39,7 @@ #define NASM_SYNC_H void init_sync(void); -void add_sync(uint32_t position, uint32_t length); -uint32_t next_sync(uint32_t position, uint32_t *length); +void add_sync(uint64_t position, uint32_t length); +uint64_t next_sync(uint64_t position, uint32_t *length); #endif |