aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoriximeow <me@iximeow.net>2021-08-21 13:21:50 -0700
committeriximeow <me@iximeow.net>2021-08-21 13:21:50 -0700
commite4131e4eb64595d9b24493eb31a9af4c5e21b1eb (patch)
tree23b0eee34ff593948b7ef012bd61a68bce0e1feb
parent9687a5af1d712da41992cba8d241ddef8bdc50ec (diff)
add push/pop/call/ret mem_size fixes to changelog
-rw-r--r--CHANGELOG6
-rw-r--r--src/protected_mode/mod.rs5
-rw-r--r--src/real_mode/mod.rs5
3 files changed, 10 insertions, 6 deletions
diff --git a/CHANGELOG b/CHANGELOG
index 5cb8d07..b10a6c0 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -8,6 +8,12 @@
about being a relative or absolute address.
- `DisplayStyle::Intel` is how `impl Display for Instruction` works, so
typical `Display` use is also fixed.
+* `push`, `pop`, `call`, and `ret` now report `mem_size` in all cases.
+ - earlier, these instructions only reported a `mem_size` if their operand was a memory access.
+ - for `call`, in 32- and 16-bit modes the reported memory size may describe
+ the *read*, not the corresponding write of pushing `{e}ip` to the stack.
+ documentation has been added to `mem_size` more specifically describing
+ this circumstance.
## 1.0.4
diff --git a/src/protected_mode/mod.rs b/src/protected_mode/mod.rs
index 79eb1b1..2d37bc6 100644
--- a/src/protected_mode/mod.rs
+++ b/src/protected_mode/mod.rs
@@ -4229,9 +4229,8 @@ impl Instruction {
/// the reported size is correct for displayed operand sizes (`word [ptr]` will have a
/// `MemoryAccessSize` indicating two bytes) but is _not_ sufficient to describe all accesses
/// of all instructions. the most notable exception is for operand-size-prefixed `call`, where
- /// `66ff10` is the instruction `call word [eax]`, but will push a four-byte `eip`. this same
- /// imprecision exists for `jmp word [mem]` as well. tools must account for these inconsistent
- /// sizes internally.
+ /// `66ff10` is the instruction `call word [eax]`, but will push a four-byte `eip`. tools must
+ /// account for these inconsistent sizes internally.
pub fn mem_size(&self) -> Option<MemoryAccessSize> {
if self.mem_size != 0 {
Some(MemoryAccessSize { size: self.mem_size })
diff --git a/src/real_mode/mod.rs b/src/real_mode/mod.rs
index 8a7e453..7f3ad42 100644
--- a/src/real_mode/mod.rs
+++ b/src/real_mode/mod.rs
@@ -4229,9 +4229,8 @@ impl Instruction {
/// the reported size is correct for displayed operand sizes (`word [ptr]` will have a
/// `MemoryAccessSize` indicating two bytes) but is _not_ sufficient to describe all accesses
/// of all instructions. the most notable exception is for operand-size-prefixed `call`, where
- /// `66ff10` is the instruction `call dword [eax]`, but will push a four-byte `eip`. this same
- /// imprecision exists for `jmp dword [mem]` as well. tools must account for these inconsistent
- /// sizes internally.
+ /// `66ff10` is the instruction `call dword [eax]`, but will push a four-byte `eip`. tools
+ /// must account for these inconsistent sizes internally.
pub fn mem_size(&self) -> Option<MemoryAccessSize> {
if self.mem_size != 0 {
Some(MemoryAccessSize { size: self.mem_size })