aboutsummaryrefslogtreecommitdiff
path: root/test/tools.rs
diff options
context:
space:
mode:
authoriximeow <me@iximeow.net>2026-06-09 07:56:30 +0000
committeriximeow <me@iximeow.net>2026-07-05 00:09:22 +0000
commit1523e9cf613e1092b80bc10cd28e7986d2c28d02 (patch)
tree493d5604925583a67a02c52ffbf30be1470060ff /test/tools.rs
parent7bffc21711fcbeeb7b5a38d3297b9b060f54534d (diff)
set up dumpbin/masm for properly assmbling and parsing in 16/32-bit modes
Diffstat (limited to 'test/tools.rs')
-rw-r--r--test/tools.rs43
1 files changed, 34 insertions, 9 deletions
diff --git a/test/tools.rs b/test/tools.rs
index ed78a17..34b194f 100644
--- a/test/tools.rs
+++ b/test/tools.rs
@@ -63,9 +63,15 @@ mod imp {
match codeness {
CodeModel::Bits16 => {
source.push_str(".286\n");
+ source.push_str(".model small\n");
+ source.push_str("assume nothing\n");
}
CodeModel::Bits32 => {
- source.push_str(".386\n");
+// do not force masm to limit itself to a 686, though that's an interesting comparison in some cases..
+// source.push_str(".686P\n");
+ source.push_str(".model flat\n");
+ source.push_str("assume fs:nothing\n");
+ source.push_str("assume gs:nothing\n");
}
CodeModel::Bits64 => {
// no special incantations to get 64-bit code out of masm
@@ -122,10 +128,17 @@ mod imp {
let dumpbin_out = std::str::from_utf8(out.stdout.as_slice()).expect("valid utf8");
- let dumpbin_interesting = carve_dumpbin_stdout(dumpbin_out).expect("works");
+ let dumpbin_interesting = carve_dumpbin_stdout(dumpbin_out)?;
let dumpbin_interesting = dumpbin_interesting[0];
- let end = " 0000000000000000: 0F C7 0F ".len();
+ let post_addr_len = "0F C7 0F ".len();
+ let addr_len = " ".len() + match codeness {
+ CodeModel::Bits64 => 16,
+ CodeModel::Bits32 => 8,
+ CodeModel::Bits16 => 4,
+ } + ":".len();
+ let start = addr_len;
+ let end = start + post_addr_len;
if dumpbin_interesting.len() <= end {
return Err("no instruction".to_string());
}
@@ -142,7 +155,7 @@ mod imp {
.replace("+", " + ")
.replace("-", " - ")
.replace("*", " * ")
- .replace(" + FFFFFFFFCCBBAA34h", " - 334455CCh") // with apologies to future-me, replace common negative displacements into more normal values...
+ .replace(" + CCBBAA34h", " - 334455CCh") // with apologies to future-me, replace common negative displacements into more normal values...
.replace("rn - sae", "rn-sae")
.replace("rd - sae", "rd-sae")
.replace("ru - sae", "ru-sae")
@@ -160,9 +173,15 @@ mod imp {
match codeness {
CodeModel::Bits16 => {
source.push_str(".286\n");
+ source.push_str(".model small\n");
+ source.push_str("assume nothing\n");
}
CodeModel::Bits32 => {
- source.push_str(".386\n");
+// do not force masm to limit itself to a 686, though that's an interesting comparison in some cases..
+// source.push_str(".686P\n");
+ source.push_str(".model flat\n");
+ source.push_str("assume fs:nothing\n");
+ source.push_str("assume gs:nothing\n");
}
CodeModel::Bits64 => {
// no special incantations to get 64-bit code out of masm
@@ -214,10 +233,16 @@ mod imp {
let dumpbin_out = std::str::from_utf8(out.stdout.as_slice()).expect("valid utf8");
- let dumpbin_interesting = carve_dumpbin_stdout(dumpbin_out).expect("works");
+ let dumpbin_interesting = carve_dumpbin_stdout(dumpbin_out)?;
- let end = " 0000000000000000: 0F C7 0F ".len();
- let start = " 0000000000000000: ".len();
+ let post_addr_len = "0F C7 0F ".len();
+ let addr_len = " ".len() + match codeness {
+ CodeModel::Bits64 => 16,
+ CodeModel::Bits32 => 8,
+ CodeModel::Bits16 => 4,
+ } + ":".len();
+ let start = addr_len;
+ let end = start + post_addr_len;
let hex_text = dumpbin_interesting[0][start..end].trim();
let mut bytes = Vec::new();
for f in hex_text.split(" ") {
@@ -278,7 +303,7 @@ fn carve_dumpbin_stdout(stdout: &str) -> Result<Vec<&str>, String> {
return Err("got multiple lines of disassembly".to_string());
}
- // eprintln!("dumpbin returns: {:?}", disasm_lines);
+ eprintln!("dumpbin returns: {:?}", disasm_lines);
Ok(disasm_lines.to_vec())
}