Skip to content

Commit 1b8019d

Browse files
committed
rename most operand variants, make them structy rather than tupley
1 parent b8a294d commit 1b8019d

File tree

10 files changed

+868
-894
lines changed

10 files changed

+868
-894
lines changed

CHANGELOG

+38-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,44 @@
1-
## 1.3.0
1+
## 2.0.0
22

33
* upgrade to `yaxpeax-arch 0.3.1`, which brings with it a deprecation of the
44
`Colorize` and `ShowContextual` traits.
5+
* because common use of yaxpeax-x86 involves using both this crate and
6+
`yaxpeax-arch`, moving to a newer major version of `yaxpeax-arch` is a major
7+
version bump of `yaxpeax-x86` as well. so, 2.0.0!
8+
9+
changes:
10+
11+
* `Operand` variants have had their naming made more consistent.
12+
- many variants starting with "Reg" actually describe a memory access. they
13+
now begin with "Mem" instead.
14+
- several variants mentioned "Scale" in their name, but not "Index", even
15+
though they use an index register. they now do.
16+
- several variants mentioned their constituent parts out of order. for
17+
example, "RegIndexBaseScaleDisp", even though the parts were specified as
18+
base, then index, then scale, then displacement. these names have been
19+
adjusted to reflect the order of their fields, which is roughly the order
20+
those fields are shown when printed.
21+
- `DisplacementU*` operands have always been access to memory at the absolute
22+
address they specify. their names are now `AbsoluteU*`
23+
* `Operand`, across the board, now uses struct-style enum variants, rather than tuple-style.
24+
* the two changes together mean an operand that was
25+
`RegIndexBaseScaleDisp(reg, reg, u8, i32)`
26+
is now
27+
`MemBaseIndexScaleDisp { base, index, scale, disp }`
28+
and similar for other variants.
29+
* two operand kinds, and their masked variants, were never actually constructed, and have been deleted.
30+
- long ago yaxpeax-x86 returned different Operand variants when an index
31+
register was used with scale 1, to hint that no scaling actually occurred.
32+
this was eventually changed to return a scaling Operand variant with
33+
scale==1, but the old variants remained.
34+
- RegIndexBase has been removed
35+
- RegIndexBaseDisp has been removed
36+
* `Prefixes::selects_cs()` has been moved to `Prefixes::cs()`, and the old
37+
useless functions are no more. `inst.prefixes().cs()` is finally a reasonable
38+
way to determine if an instruction reads or writes through the cs prefix.
39+
40+
fixes:
41+
542
* fix 32-bit call/jmp not respecting 66 prefix if set - such cases use 16-bit
643
operands, but decoded as if they used 32-bit operands.
744

src/lib.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,10 @@
3535
//! #[cfg(features="fmt")]
3636
//! assert_eq!("xor eax, dword [rcx]", inst.to_string());
3737
//!
38-
//! assert_eq!(Operand::Register(RegSpec::eax()), inst.operand(0));
38+
//! assert_eq!(Operand::Register { reg: RegSpec::eax() }, inst.operand(0));
3939
//! #[cfg(features="fmt")]
4040
//! assert_eq!("eax", inst.operand(0).to_string());
41-
//! assert_eq!(Operand::RegDeref(RegSpec::rcx()), inst.operand(1));
41+
//! assert_eq!(Operand::MemDeref { base: RegSpec::rcx() }, inst.operand(1));
4242
//!
4343
//! // an operand in isolation does not know the size of memory it references, if any
4444
//! #[cfg(features="fmt")]

src/long_mode/display.rs

+38-38
Original file line numberDiff line numberDiff line change
@@ -430,9 +430,9 @@ impl <T: DisplaySink> super::OperandVisitor for DisplayingOperandVisitor<'_, T>
430430
}
431431
#[cfg_attr(not(feature="profiling"), inline(always))]
432432
#[cfg_attr(feature="profiling", inline(never))]
433-
fn visit_disp(&mut self, reg: RegSpec, disp: i32) -> Result<Self::Ok, Self::Error> {
433+
fn visit_disp(&mut self, base: RegSpec, disp: i32) -> Result<Self::Ok, Self::Error> {
434434
self.f.write_char('[')?;
435-
self.f.write_reg(reg)?;
435+
self.f.write_reg(base)?;
436436
self.f.write_fixed_size(" ")?;
437437

438438
{
@@ -447,23 +447,23 @@ impl <T: DisplaySink> super::OperandVisitor for DisplayingOperandVisitor<'_, T>
447447
}
448448
self.f.write_fixed_size("]")
449449
}
450-
fn visit_deref(&mut self, reg: RegSpec) -> Result<Self::Ok, Self::Error> {
450+
fn visit_deref(&mut self, base: RegSpec) -> Result<Self::Ok, Self::Error> {
451451
self.f.write_fixed_size("[")?;
452-
self.f.write_reg(reg)?;
452+
self.f.write_reg(base)?;
453453
self.f.write_fixed_size("]")
454454
}
455-
fn visit_reg_scale(&mut self, reg: RegSpec, scale: u8) -> Result<Self::Ok, Self::Error> {
455+
fn visit_index_scale(&mut self, index: RegSpec, scale: u8) -> Result<Self::Ok, Self::Error> {
456456
self.f.write_fixed_size("[")?;
457-
self.f.write_reg(reg)?;
457+
self.f.write_reg(index)?;
458458
self.f.write_fixed_size(" * ")?;
459459
self.f.write_char((0x30 + scale) as char)?; // translate scale=1 to '1', scale=2 to '2', etc
460460
self.f.write_fixed_size("]")?;
461461

462462
Ok(())
463463
}
464-
fn visit_reg_scale_disp(&mut self, reg: RegSpec, scale: u8, disp: i32) -> Result<Self::Ok, Self::Error> {
464+
fn visit_index_scale_disp(&mut self, index: RegSpec, scale: u8, disp: i32) -> Result<Self::Ok, Self::Error> {
465465
self.f.write_fixed_size("[")?;
466-
self.f.write_reg(reg)?;
466+
self.f.write_reg(index)?;
467467
self.f.write_fixed_size(" * ")?;
468468
self.f.write_char((0x30 + scale) as char)?; // translate scale=1 to '1', scale=2 to '2', etc
469469
self.f.write_fixed_size(" ")?;
@@ -480,7 +480,7 @@ impl <T: DisplaySink> super::OperandVisitor for DisplayingOperandVisitor<'_, T>
480480
}
481481
self.f.write_char(']')
482482
}
483-
fn visit_index_base_scale(&mut self, base: RegSpec, index: RegSpec, scale: u8) -> Result<Self::Ok, Self::Error> {
483+
fn visit_base_index_scale(&mut self, base: RegSpec, index: RegSpec, scale: u8) -> Result<Self::Ok, Self::Error> {
484484
self.f.write_fixed_size("[")?;
485485
self.f.write_reg(base)?;
486486
self.f.write_fixed_size(" + ")?;
@@ -489,7 +489,7 @@ impl <T: DisplaySink> super::OperandVisitor for DisplayingOperandVisitor<'_, T>
489489
self.f.write_char((0x30 + scale) as char)?; // translate scale=1 to '1', scale=2 to '2', etc
490490
self.f.write_fixed_size("]")
491491
}
492-
fn visit_index_base_scale_disp(&mut self, base: RegSpec, index: RegSpec, scale: u8, disp: i32) -> Result<Self::Ok, Self::Error> {
492+
fn visit_base_index_scale_disp(&mut self, base: RegSpec, index: RegSpec, scale: u8, disp: i32) -> Result<Self::Ok, Self::Error> {
493493
self.f.write_fixed_size("[")?;
494494
self.f.write_reg(base)?;
495495
self.f.write_fixed_size(" + ")?;
@@ -510,9 +510,9 @@ impl <T: DisplaySink> super::OperandVisitor for DisplayingOperandVisitor<'_, T>
510510
}
511511
self.f.write_fixed_size("]")
512512
}
513-
fn visit_reg_disp_masked(&mut self, spec: RegSpec, disp: i32, mask_reg: RegSpec) -> Result<Self::Ok, Self::Error> {
513+
fn visit_disp_masked(&mut self, base: RegSpec, disp: i32, mask_reg: RegSpec) -> Result<Self::Ok, Self::Error> {
514514
self.f.write_char('[')?;
515-
self.f.write_reg(spec)?;
515+
self.f.write_reg(base)?;
516516
self.f.write_char(' ')?;
517517
let mut v = disp as u32;
518518
if disp < 0 {
@@ -528,18 +528,18 @@ impl <T: DisplaySink> super::OperandVisitor for DisplayingOperandVisitor<'_, T>
528528
self.f.write_char('}')?;
529529
Ok(())
530530
}
531-
fn visit_reg_deref_masked(&mut self, spec: RegSpec, mask_reg: RegSpec) -> Result<Self::Ok, Self::Error> {
531+
fn visit_deref_masked(&mut self, base: RegSpec, mask_reg: RegSpec) -> Result<Self::Ok, Self::Error> {
532532
self.f.write_fixed_size("[")?;
533-
self.f.write_reg(spec)?;
533+
self.f.write_reg(base)?;
534534
self.f.write_fixed_size("]")?;
535535
self.f.write_char('{')?;
536536
self.f.write_reg(mask_reg)?;
537537
self.f.write_char('}')?;
538538
Ok(())
539539
}
540-
fn visit_reg_scale_masked(&mut self, spec: RegSpec, scale: u8, mask_reg: RegSpec) -> Result<Self::Ok, Self::Error> {
540+
fn visit_index_scale_masked(&mut self, index: RegSpec, scale: u8, mask_reg: RegSpec) -> Result<Self::Ok, Self::Error> {
541541
self.f.write_fixed_size("[")?;
542-
self.f.write_reg(spec)?;
542+
self.f.write_reg(index)?;
543543
self.f.write_fixed_size(" * ")?;
544544
self.f.write_char((0x30 + scale) as char)?; // translate scale=1 to '1', scale=2 to '2', etc
545545
self.f.write_fixed_size("]")?;
@@ -548,9 +548,9 @@ impl <T: DisplaySink> super::OperandVisitor for DisplayingOperandVisitor<'_, T>
548548
self.f.write_char('}')?;
549549
Ok(())
550550
}
551-
fn visit_reg_scale_disp_masked(&mut self, spec: RegSpec, scale: u8, disp: i32, mask_reg: RegSpec) -> Result<Self::Ok, Self::Error> {
551+
fn visit_index_scale_disp_masked(&mut self, index: RegSpec, scale: u8, disp: i32, mask_reg: RegSpec) -> Result<Self::Ok, Self::Error> {
552552
self.f.write_fixed_size("[")?;
553-
self.f.write_reg(spec)?;
553+
self.f.write_reg(index)?;
554554
self.f.write_fixed_size(" * ")?;
555555
self.f.write_char((0x30 + scale) as char)?; // translate scale=1 to '1', scale=2 to '2', etc
556556
self.f.write_fixed_size(" ")?;
@@ -568,7 +568,7 @@ impl <T: DisplaySink> super::OperandVisitor for DisplayingOperandVisitor<'_, T>
568568
self.f.write_char('}')?;
569569
Ok(())
570570
}
571-
fn visit_index_base_masked(&mut self, base: RegSpec, index: RegSpec, mask_reg: RegSpec) -> Result<Self::Ok, Self::Error> {
571+
fn visit_base_index_masked(&mut self, base: RegSpec, index: RegSpec, mask_reg: RegSpec) -> Result<Self::Ok, Self::Error> {
572572
self.f.write_fixed_size("[")?;
573573
self.f.write_reg(base)?;
574574
self.f.write_fixed_size(" + ")?;
@@ -579,7 +579,7 @@ impl <T: DisplaySink> super::OperandVisitor for DisplayingOperandVisitor<'_, T>
579579
self.f.write_char('}')?;
580580
Ok(())
581581
}
582-
fn visit_index_base_disp_masked(&mut self, base: RegSpec, index: RegSpec, disp: i32, mask_reg: RegSpec) -> Result<Self::Ok, Self::Error> {
582+
fn visit_base_index_disp_masked(&mut self, base: RegSpec, index: RegSpec, disp: i32, mask_reg: RegSpec) -> Result<Self::Ok, Self::Error> {
583583
self.f.write_fixed_size("[")?;
584584
self.f.write_reg(base)?;
585585
self.f.write_fixed_size(" + ")?;
@@ -599,7 +599,7 @@ impl <T: DisplaySink> super::OperandVisitor for DisplayingOperandVisitor<'_, T>
599599
self.f.write_char('}')?;
600600
Ok(())
601601
}
602-
fn visit_index_base_scale_masked(&mut self, base: RegSpec, index: RegSpec, scale: u8, mask_reg: RegSpec) -> Result<Self::Ok, Self::Error> {
602+
fn visit_base_index_scale_masked(&mut self, base: RegSpec, index: RegSpec, scale: u8, mask_reg: RegSpec) -> Result<Self::Ok, Self::Error> {
603603
self.f.write_fixed_size("[")?;
604604
self.f.write_reg(base)?;
605605
self.f.write_fixed_size(" + ")?;
@@ -612,7 +612,7 @@ impl <T: DisplaySink> super::OperandVisitor for DisplayingOperandVisitor<'_, T>
612612
self.f.write_char('}')?;
613613
Ok(())
614614
}
615-
fn visit_index_base_scale_disp_masked(&mut self, base: RegSpec, index: RegSpec, scale: u8, disp: i32, mask_reg: RegSpec) -> Result<Self::Ok, Self::Error> {
615+
fn visit_base_index_scale_disp_masked(&mut self, base: RegSpec, index: RegSpec, scale: u8, disp: i32, mask_reg: RegSpec) -> Result<Self::Ok, Self::Error> {
616616
self.f.write_fixed_size("[")?;
617617
self.f.write_reg(base)?;
618618
self.f.write_fixed_size(" + ")?;
@@ -3860,7 +3860,7 @@ pub(crate) fn contextualize_c<T: DisplaySink>(instr: &Instruction, out: &mut T)
38603860
let mut out = yaxpeax_arch::display::FmtSink::new(out);
38613861
use core::fmt::Write;
38623862
match op {
3863-
Operand::ImmediateI8(rel) => {
3863+
Operand::ImmediateI8 { imm: rel } => {
38643864
let rel = if rel >= 0 {
38653865
out.write_str("$+")?;
38663866
rel as u8
@@ -3870,7 +3870,7 @@ pub(crate) fn contextualize_c<T: DisplaySink>(instr: &Instruction, out: &mut T)
38703870
};
38713871
out.write_prefixed_u8(rel)
38723872
}
3873-
Operand::ImmediateI32(rel) => {
3873+
Operand::ImmediateI32 { imm: rel } => {
38743874
let rel = if rel >= 0 {
38753875
out.write_str("$+")?;
38763876
rel as u32
@@ -4272,10 +4272,10 @@ impl<'a, F: DisplaySink> super::OperandVisitor for RelativeBranchPrinter<'a, F>
42724272
fn visit_reg(&mut self, _reg: RegSpec) -> Result<Self::Ok, Self::Error> {
42734273
Ok(false)
42744274
}
4275-
fn visit_deref(&mut self, _reg: RegSpec) -> Result<Self::Ok, Self::Error> {
4275+
fn visit_deref(&mut self, _base: RegSpec) -> Result<Self::Ok, Self::Error> {
42764276
Ok(false)
42774277
}
4278-
fn visit_disp(&mut self, _reg: RegSpec, _disp: i32) -> Result<Self::Ok, Self::Error> {
4278+
fn visit_disp(&mut self, _base: RegSpec, _disp: i32) -> Result<Self::Ok, Self::Error> {
42794279
Ok(false)
42804280
}
42814281
#[cfg_attr(feature="profiling", inline(never))]
@@ -4338,16 +4338,16 @@ impl<'a, F: DisplaySink> super::OperandVisitor for RelativeBranchPrinter<'a, F>
43384338
fn visit_abs_u64(&mut self, _imm: u64) -> Result<Self::Ok, Self::Error> {
43394339
Ok(false)
43404340
}
4341-
fn visit_reg_scale(&mut self, _reg: RegSpec, _scale: u8) -> Result<Self::Ok, Self::Error> {
4341+
fn visit_index_scale(&mut self, _index: RegSpec, _scale: u8) -> Result<Self::Ok, Self::Error> {
43424342
Ok(false)
43434343
}
4344-
fn visit_index_base_scale(&mut self, _base: RegSpec, _index: RegSpec, _scale: u8) -> Result<Self::Ok, Self::Error> {
4344+
fn visit_base_index_scale(&mut self, _base: RegSpec, _index: RegSpec, _scale: u8) -> Result<Self::Ok, Self::Error> {
43454345
Ok(false)
43464346
}
4347-
fn visit_reg_scale_disp(&mut self, _reg: RegSpec, _scale: u8, _disp: i32) -> Result<Self::Ok, Self::Error> {
4347+
fn visit_index_scale_disp(&mut self, _index: RegSpec, _scale: u8, _disp: i32) -> Result<Self::Ok, Self::Error> {
43484348
Ok(false)
43494349
}
4350-
fn visit_index_base_scale_disp(&mut self, _base: RegSpec, _index: RegSpec, _scale: u8, _disp: i32) -> Result<Self::Ok, Self::Error> {
4350+
fn visit_base_index_scale_disp(&mut self, _base: RegSpec, _index: RegSpec, _scale: u8, _disp: i32) -> Result<Self::Ok, Self::Error> {
43514351
Ok(false)
43524352
}
43534353
fn visit_other(&mut self) -> Result<Self::Ok, Self::Error> {
@@ -4362,28 +4362,28 @@ impl<'a, F: DisplaySink> super::OperandVisitor for RelativeBranchPrinter<'a, F>
43624362
fn visit_reg_mask_merge_sae_noround(&mut self, _spec: RegSpec, _mask: RegSpec, _merge_mode: MergeMode) -> Result<Self::Ok, Self::Error> {
43634363
Ok(false)
43644364
}
4365-
fn visit_reg_disp_masked(&mut self, _spec: RegSpec, _disp: i32, _mask_reg: RegSpec) -> Result<Self::Ok, Self::Error> {
4365+
fn visit_disp_masked(&mut self, _base: RegSpec, _disp: i32, _mask_reg: RegSpec) -> Result<Self::Ok, Self::Error> {
43664366
Ok(false)
43674367
}
4368-
fn visit_reg_deref_masked(&mut self, _spec: RegSpec, _mask_reg: RegSpec) -> Result<Self::Ok, Self::Error> {
4368+
fn visit_deref_masked(&mut self, _base: RegSpec, _mask_reg: RegSpec) -> Result<Self::Ok, Self::Error> {
43694369
Ok(false)
43704370
}
4371-
fn visit_reg_scale_masked(&mut self, _spec: RegSpec, _scale: u8, _mask_reg: RegSpec) -> Result<Self::Ok, Self::Error> {
4371+
fn visit_index_scale_masked(&mut self, _index: RegSpec, _scale: u8, _mask_reg: RegSpec) -> Result<Self::Ok, Self::Error> {
43724372
Ok(false)
43734373
}
4374-
fn visit_reg_scale_disp_masked(&mut self, _spec: RegSpec, _scale: u8, _disp: i32, _mask_reg: RegSpec) -> Result<Self::Ok, Self::Error> {
4374+
fn visit_index_scale_disp_masked(&mut self, _index: RegSpec, _scale: u8, _disp: i32, _mask_reg: RegSpec) -> Result<Self::Ok, Self::Error> {
43754375
Ok(false)
43764376
}
4377-
fn visit_index_base_masked(&mut self, _base: RegSpec, _index: RegSpec, _mask_reg: RegSpec) -> Result<Self::Ok, Self::Error> {
4377+
fn visit_base_index_masked(&mut self, _base: RegSpec, _index: RegSpec, _mask_reg: RegSpec) -> Result<Self::Ok, Self::Error> {
43784378
Ok(false)
43794379
}
4380-
fn visit_index_base_disp_masked(&mut self, _base: RegSpec, _index: RegSpec, _disp: i32, _mask_reg: RegSpec) -> Result<Self::Ok, Self::Error> {
4380+
fn visit_base_index_disp_masked(&mut self, _base: RegSpec, _index: RegSpec, _disp: i32, _mask_reg: RegSpec) -> Result<Self::Ok, Self::Error> {
43814381
Ok(false)
43824382
}
4383-
fn visit_index_base_scale_masked(&mut self, _base: RegSpec, _index: RegSpec, _scale: u8, _mask_reg: RegSpec) -> Result<Self::Ok, Self::Error> {
4383+
fn visit_base_index_scale_masked(&mut self, _base: RegSpec, _index: RegSpec, _scale: u8, _mask_reg: RegSpec) -> Result<Self::Ok, Self::Error> {
43844384
Ok(false)
43854385
}
4386-
fn visit_index_base_scale_disp_masked(&mut self, _base: RegSpec, _index: RegSpec, _scale: u8, _disp: i32, _mask_reg: RegSpec) -> Result<Self::Ok, Self::Error> {
4386+
fn visit_base_index_scale_disp_masked(&mut self, _base: RegSpec, _index: RegSpec, _scale: u8, _disp: i32, _mask_reg: RegSpec) -> Result<Self::Ok, Self::Error> {
43874387
Ok(false)
43884388
}
43894389
}

0 commit comments

Comments
 (0)