diff --git a/dumpobj.cpp b/dumpobj.cpp
index c59ab44..1a35da7 100644
--- a/dumpobj.cpp
+++ b/dumpobj.cpp
@@ -166,19 +166,32 @@ void dump_obj(const char *name, int fd)
 
 
 	printf("name: %s\n", oname.data());
-	printf("record size: %04x\n", h.h_recsize);
-	printf("section size: %04x\n", h.h_secsize);
-	printf("symbol size: %04x\n", h.h_symsize);
-	printf("option size: %04x\n", h.h_optsize);
-	printf("number sections: %04x\n", h.h_num_secs);
-	printf("number symbols: %04x\n", h.h_num_syms);
+	printf("record size    : $%04x\n", h.h_recsize);
+	printf("section size   : $%04x\n", h.h_secsize);
+	printf("symbol size    : $%04x\n", h.h_symsize);
+	printf("option size    : $%04x\n", h.h_optsize);
+	printf("number sections: $%04x\n", h.h_num_secs);
+	printf("number symbols : $%04x\n", h.h_num_syms);
 
 	// records [until record_eof]
 
 	std::vector<uint8_t> data;
 	data.resize(h.h_recsize);
 	ok = read(fd, data.data(), h.h_recsize);
-	if (ok != h.h_recsize) errx(EX_DATAERR, "%s truncated", name);
+	if (ok != h.h_recsize) errx(EX_DATAERR, "%s records truncated", name);
+
+
+	std::vector<uint8_t> section_data;
+	section_data.resize(h.h_secsize);
+	ok = read(fd, section_data.data(), h.h_secsize);
+	if (ok != h.h_secsize) errx(EX_DATAERR, "%s sections truncated", name);
+
+
+	std::vector<uint8_t> symbol_data;
+	symbol_data.resize(h.h_symsize);
+	ok = read(fd, symbol_data.data(), h.h_symsize);
+	if (ok != h.h_symsize) errx(EX_DATAERR, "%s symbols truncated", name);
+
 
 
 	uint8_t op = REC_END;
@@ -204,42 +217,60 @@ void dump_obj(const char *name, int fd)
 					uint8_t op = 0;
 					bytes = read_8(iter);
 
-					std::string tmp;
 					char buffer[32];
 
 
+					std::vector<std::string> stack;
+
+					// todo -- need to keep operation for precedence?
+					// this ignores all precedence...
+
 					for(;;) {
 						op = read_8(iter);
 						if (op == OP_END) break;
 						switch (op) {
 							case OP_LOC: {
-									uint8_t section = read_8(iter);
-									uint32_t offset = read_32(iter);
-									if (section < sizeof(sections) / sizeof(sections[0]))
-										snprintf(buffer, sizeof(buffer), "%s+%04x ", sections[section], offset);
-									else
-										snprintf(buffer, sizeof(buffer), "section %02x+%04x ", section, offset);
-								}
-								tmp.append(buffer);
+								uint8_t section = read_8(iter);
+								uint32_t offset = read_32(iter);
+								if (section < sizeof(sections) / sizeof(sections[0]))
+									snprintf(buffer, sizeof(buffer), "%s+$%04x", sections[section], offset);
+								else
+									snprintf(buffer, sizeof(buffer), "section %02x+$%04x", section, offset);
+								stack.push_back(buffer);
 								break;
+							}
+
 							case OP_VAL:
-								snprintf(buffer, sizeof(buffer), "$%04x ", read_32(iter));
-								tmp.append(buffer);
+								snprintf(buffer, sizeof(buffer), "$%04x", read_32(iter));
+								stack.push_back(buffer);
 								break;
+
 							case OP_SYM:
-								snprintf(buffer, sizeof(buffer), "symbol %02x ", read_16(iter));
-								tmp.append(buffer);
+								snprintf(buffer, sizeof(buffer), "symbol $%02x", read_16(iter));
+								stack.push_back(buffer);
 								break;
-							case OP_SHR: tmp.append(">> "); break;
-							case OP_SHL: tmp.append("<< "); break;
-							case OP_ADD: tmp.append("+ "); break;
-							case OP_SUB: tmp.append("- "); break;
+
+							case OP_SHR: 
+							case OP_SHL:
+							case OP_ADD: 
+							case OP_SUB: {
+								static const char *ops[] = {
+									"**", "*", "/", "%", ">>", "<<", "+", "-", "&", "|", "^", "=", ">", "<"
+
+								};
+								if (stack.size() < 2) errx(EX_DATAERR, "%s : stack underflow error", name);
+								std::string a = std::move(stack.back()); stack.pop_back();
+								std::string b = std::move(stack.back()); stack.pop_back();
+								stack.emplace_back(b + ops[op-20] + a);
+								break;
+							}
 							default:
 								errx(EX_DATAERR, "%s: unknown expression opcode %02x", name, op);
 
 						}
 					}
-					d.process(tmp, bytes);
+					if (stack.size() != 1) errx(EX_DATAERR, "%s stack overflow error.", name);
+					d.process(stack.front(), bytes);
 				}
 				break;
 
@@ -345,14 +376,10 @@ void dump_obj(const char *name, int fd)
 
 	// section info
 
-	data.resize(h.h_secsize);
-	ok = read(fd, data.data(), h.h_secsize);
-	if (ok != h.h_secsize) errx(EX_DATAERR, "%s truncated", name);
-
 	printf("\nSections\n");
 
-	iter = data.begin();
-	while (iter != data.end()) {
+	iter = section_data.begin();
+	while (iter != section_data.end()) {
 
 
 		uint8_t number = read_8(iter);
@@ -382,23 +409,20 @@ void dump_obj(const char *name, int fd)
 
 
 	// symbol info
-	data.resize(h.h_symsize);
-	ok = read(fd, data.data(), h.h_symsize);
-	if (ok != h.h_symsize) errx(EX_DATAERR, "%s truncated", name);
 
 	printf("\nSymbols\n");
 
-	iter = data.begin();
-	while (iter != data.end()) {
+	iter = symbol_data.begin();
+	while (iter != symbol_data.end()) {
 		uint8_t type = read_8(iter);
 		uint8_t flags = read_8(iter);
 		uint8_t section = read_8(iter);
 		uint32_t offset = type == S_UND ? 0 : read_32(iter);
 		std::string name = read_cstring(iter);
 
-		printf("name: %s\n", name.c_str());
-		printf("type: %02x %s\n", type, type < sizeof(types) / sizeof(types[0]) ? types[type] : "");
-		printf("flags: %02x ", flags);
+		printf("name : %s\n", name.c_str());
+		printf("type : $%02x %s\n", type, type < sizeof(types) / sizeof(types[0]) ? types[type] : "");
+		printf("flags: $%02x ", flags);
 #undef _
 #define _(x) if (flags & x) fputs(#x " ", stdout)
 		_(SF_GBL);
@@ -444,9 +468,9 @@ void dump_lib(const char *name, int fd)
 	assert(h.l_version == 1);
 	assert(h.l_filtyp == 2);
 
-	printf("modstart: %04x\n", h.l_modstart);
-	printf("number symbols: %04x\n", h.l_numsyms);
-	printf("number files: %04x\n", h.l_numfiles);
+	printf("modstart      : $%04x\n", h.l_modstart);
+	printf("number symbols: $%04x\n", h.l_numsyms);
+	printf("number files  : $%04x\n", h.l_numfiles);
 
 	printf("\n");
 	std::vector<uint8_t> data;
@@ -462,7 +486,7 @@ void dump_lib(const char *name, int fd)
 	for (int i = 0; i < h.l_numfiles; ++i) {
 		uint16_t file_number = read_16(iter);
 		std::string s = read_pstring(iter);
-		printf("%02x %s\n", file_number, s.c_str());
+		printf("$%02x %s\n", file_number, s.c_str());
 	}
 	printf("\n");
 
@@ -474,10 +498,10 @@ void dump_lib(const char *name, int fd)
 		uint32_t offset = read_32(iter);
 		std::string name = read_pstring(name_iter);
 
-		printf("symbol: %04x %s\n", i, name.c_str());
+		printf("symbol       : $%04x %s\n", i, name.c_str());
 		//printf("name offset: %02x\n", name_offset);
-		printf("file_number: %02x\n", file_number);
-		printf("module offset: %04x\n", offset); 
+		printf("file_number  : $%02x\n", file_number);
+		printf("module offset: $%04x\n", offset); 
 	}
 	printf("\n");