From c525bcb9024510cad9e170e12b6209aedb330f83 Mon Sep 17 00:00:00 2001 From: Mike Pall Date: Sat, 23 Dec 2023 20:06:17 +0100 Subject: [PATCH] DynASM/x86: Allow [&expr] operand. Thanks to Dmitry Stogov. #1138 --- dynasm/dasm_x86.lua | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/dynasm/dasm_x86.lua b/dynasm/dasm_x86.lua index 787163c0..df70fed8 100644 --- a/dynasm/dasm_x86.lua +++ b/dynasm/dasm_x86.lua @@ -627,7 +627,11 @@ local function wputmrmsib(t, imark, s, vsreg, psz, sk) werror("NYI: rip-relative displacement followed by immediate") end -- The previous byte in the action buffer cannot be 0xe9 or 0x80-0x8f. - wputlabel("REL_", disp[1], 2) + if disp[2] == "iPJ" then + waction("REL_A", disp[1]) + else + wputlabel("REL_", disp[1], 2) + end else wputdarg(disp) end @@ -744,9 +748,9 @@ local function dispexpr(expr) return imm*map_opsizenum[ops] end local mode, iexpr = immexpr(dispt) - if mode == "iJ" then + if mode == "iJ" or mode == "iPJ" then if c == "-" then werror("cannot invert label reference") end - return { iexpr } + return { iexpr, mode } end return expr -- Need to return original signed expression. end