diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/address/SegmentedAddress.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/address/SegmentedAddress.java index 69f5e65cb0..bec22700ed 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/address/SegmentedAddress.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/address/SegmentedAddress.java @@ -31,7 +31,7 @@ public class SegmentedAddress extends GenericAddress { */ SegmentedAddress(long flat, SegmentedAddressSpace addrSpace) { super(adjustOffset(flat, addrSpace), addrSpace); - segment = addrSpace.getSegmentFromFlat(flat); + segment = addrSpace.getDefaultSegmentFromFlat(flat); } /** @@ -56,12 +56,12 @@ public class SegmentedAddress extends GenericAddress { SegmentedAddress(SegmentedAddressSpace addrSpace, long flat) throws AddressOutOfBoundsException { super(addrSpace, adjustOffset(flat, addrSpace)); - segment = addrSpace.getSegmentFromFlat(flat); + segment = addrSpace.getDefaultSegmentFromFlat(flat); } private static long adjustOffset(long flat, SegmentedAddressSpace addrSpace) { - int seg = addrSpace.getSegmentFromFlat(flat); - long offset = addrSpace.getOffsetFromFlat(flat); + int seg = addrSpace.getDefaultSegmentFromFlat(flat); + long offset = addrSpace.getDefaultOffsetFromFlat(flat); return addrSpace.getFlatOffset(seg, offset); } @@ -78,7 +78,7 @@ public class SegmentedAddress extends GenericAddress { * @return the offset value */ public int getSegmentOffset() { - return (int) ((SegmentedAddressSpace) addrSpace).getOffsetFromFlat(offset); + return (int) ((SegmentedAddressSpace) addrSpace).getOffsetFromFlat(offset, segment); } /** diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/address/SegmentedAddressSpace.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/address/SegmentedAddressSpace.java index 0e57167ea4..9c72cbd400 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/address/SegmentedAddressSpace.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/address/SegmentedAddressSpace.java @@ -52,11 +52,11 @@ public class SegmentedAddressSpace extends GenericAddressSpace { } /** - * Given a flat address offset, extract the 16-bit segment portion + * Given a flat address offset, extract the default 16-bit segment portion * @param flat is the flat offset * @return the segment value */ - protected int getSegmentFromFlat(long flat) { + protected int getDefaultSegmentFromFlat(long flat) { if (flat > 0xFFFFFL) { return 0xFFFF; } @@ -64,17 +64,29 @@ public class SegmentedAddressSpace extends GenericAddressSpace { } /** - * Given a flat address offset, extract the offset portion + * Given a flat address offset, extract the offset portion assuming the + * default segment. * @param flat is the flat offset * @return the offset value */ - protected long getOffsetFromFlat(long flat) { + protected long getDefaultOffsetFromFlat(long flat) { if (flat > 0xFFFFFL) { return flat - 0xFFFF0; } return flat & 0xFFFFL; } + /** + * Given a flat address offset, extract a segment offset assuming a + * specific segment value. + * @param flat is the flat offset + * @param segment is the specific segment value + * @return the segment offset + */ + protected long getOffsetFromFlat(long flat, int segment) { + return flat - (segment << 4); + } + /** * Given a flat address offset and a preferred segment, try * to create an address that maps to the offset and is in the segment. For