Mercurial > hg-old > index.cgi
diff lwdisasm/do_raw.c @ 409:cba03436c720
Checkpoint disassembler
author | lost@l-w.ca |
---|---|
date | Mon, 02 Aug 2010 18:07:04 -0600 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lwdisasm/do_raw.c Mon Aug 02 18:07:04 2010 -0600 @@ -0,0 +1,74 @@ +/* +do_raw.c + +Copyright © 2010 William Astle + +This file is part of LWTOOLS. + +LWTOOLS is free software: you can redistribute it and/or modify it under the +terms of the GNU General Public License as published by the Free Software +Foundation, either version 3 of the License, or (at your option) any later +version. + +This program is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +more details. + +You should have received a copy of the GNU General Public License along with +this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +#include <config.h> + +#include <stdio.h> +#include <stdlib.h> + +#include "lwdisasm.h" + +void do_disasm_raw(disasmstate_t *as) +{ + linedata_t *l; + symbol_t *s; + char bytebuf[11]; + int i; + + // initialize disassembly + as -> curoff = as -> entry; + as -> crange = lookup_range(as, as -> curoff); + + + while (l = disasm_insn(as)) + { + if (!as -> ltail) + as -> lhead = l; + else + as -> ltail -> next = l; + l -> prev = as -> ltail; + as -> ltail = l; + + if (l -> target != -1) + { + s = register_symbol(as, l -> target, l -> sectionref, NULL); + l -> symbol = s; + } + } + + attach_symbols(as); + + for (l = as -> lhead; l; l = l -> next) + { + if (l -> target != -1) + redisasm_insn(as, l); + } + + for (l = as -> lhead; l; l = l -> next) + { + bytebuf[0] = 0; + for (i = 0; i < l -> length; i++) + { + sprintf(bytebuf, "%s%02X", bytebuf, l -> bytes[i]); + } + printf("%04X %-10s %-15s %s\n", l -> address, bytebuf, l -> isref ? l -> symbol -> symbol : "", l -> disasm); + } +}