mirror of
https://github.com/asmjit/asmjit.git
synced 2025-12-17 20:44:37 +03:00
[bug] Fixed special case of mov[abs] instruction
This commit is contained in:
@@ -970,7 +970,7 @@ public:
|
||||
//! Get a higher part of a 64-bit offset or absolute address.
|
||||
//!
|
||||
//! NOTE: This function is UNSAFE and returns garbage if `has64BitOffset()`
|
||||
//! returns false. Never use blindly without checking it.
|
||||
//! returns false. Never use it blindly without checking it.
|
||||
ASMJIT_INLINE int32_t getOffsetHi32() const noexcept { return static_cast<int32_t>(_mem.base); }
|
||||
|
||||
//! Set a 64-bit offset or an absolute address to `offset`.
|
||||
|
||||
@@ -1508,17 +1508,17 @@ CaseX86M_GPB_MulDiv:
|
||||
ADD_PREFIX_BY_SIZE(o0.getSize());
|
||||
}
|
||||
|
||||
// Handle a special form 'mov al|ax|eax|rax, [ptr64]' that doesn't use MOD.
|
||||
// Handle a special form `mov al|ax|eax|rax, [ptr64]` that doesn't use MOD.
|
||||
if (o0.getId() == X86Gp::kIdAx && !rmRel->as<X86Mem>().hasBaseOrIndex()) {
|
||||
opCode += 0xA0;
|
||||
imVal = rmRel->as<X86Mem>().getOffset();
|
||||
imLen = getGpSize();
|
||||
goto EmitX86Op;
|
||||
}
|
||||
else {
|
||||
opCode += 0x8A;
|
||||
goto EmitX86M;
|
||||
if (!is64Bit() || (is64Bit() && ((options & X86Inst::kOptionLongForm) || !Utils::isInt32(imVal)))) {
|
||||
opCode += 0xA0;
|
||||
goto EmitX86OpMovAbs;
|
||||
}
|
||||
}
|
||||
|
||||
opCode += 0x8A;
|
||||
goto EmitX86M;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1543,17 +1543,17 @@ CaseX86M_GPB_MulDiv:
|
||||
ADD_PREFIX_BY_SIZE(o1.getSize());
|
||||
}
|
||||
|
||||
// Handle a special form 'mov [ptr64], al|ax|eax|rax' that doesn't use MOD.
|
||||
if (!rmRel->as<X86Mem>().hasBaseOrIndex() && o1.getId() == X86Gp::kIdAx) {
|
||||
opCode += 0xA2;
|
||||
// Handle a special form `mov [ptr64], al|ax|eax|rax` that doesn't use MOD.
|
||||
if (o1.getId() == X86Gp::kIdAx && !rmRel->as<X86Mem>().hasBaseOrIndex()) {
|
||||
imVal = rmRel->as<X86Mem>().getOffset();
|
||||
imLen = getGpSize();
|
||||
goto EmitX86Op;
|
||||
}
|
||||
else {
|
||||
opCode += 0x88;
|
||||
goto EmitX86M;
|
||||
if (!is64Bit() || (is64Bit() && ((options & X86Inst::kOptionLongForm) || !Utils::isInt32(imVal)))) {
|
||||
opCode += 0xA2;
|
||||
goto EmitX86OpMovAbs;
|
||||
}
|
||||
}
|
||||
|
||||
opCode += 0x88;
|
||||
goto EmitX86M;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3531,6 +3531,13 @@ CaseVexRvm_R:
|
||||
// [Emit - X86]
|
||||
// --------------------------------------------------------------------------
|
||||
|
||||
EmitX86OpMovAbs:
|
||||
imLen = getGpSize();
|
||||
|
||||
// Segment-override prefix.
|
||||
if (rmRel->as<X86Mem>().hasSegment())
|
||||
EMIT_BYTE(x86SegmentPrefix[rmRel->as<X86Mem>().getSegmentId()]);
|
||||
|
||||
EmitX86Op:
|
||||
// Emit mandatory instruction prefix.
|
||||
EMIT_PP(opCode);
|
||||
|
||||
Reference in New Issue
Block a user