Skip to content

Instantly share code, notes, and snippets.

@meithecatte
Created April 5, 2025 17:05
Show Gist options
  • Save meithecatte/59b7ddd18a83975685ff4f493ad44bd9 to your computer and use it in GitHub Desktop.
Save meithecatte/59b7ddd18a83975685ff4f493ad44bd9 to your computer and use it in GitHub Desktop.
Force nasm to e.g. encode a reg-reg xor as 0x33 instead of 0x31
%define is_gpr(r) \
(%isidni(r, ax) || %isidni(r, cx) || %isidni(r, dx) || %isidni(r, bx) || \
%isidni(r, sp) || %isidni(r, bp) || %isidni(r, si) || %isidni(r, di))
%define num_gpr(r) \
(0*%isidni(r, ax) + 1*%isidni(r, cx) + 2*%isidni(r, dx) + 3*%isidni(r, bx) + \
4*%isidni(r, sp) + 5*%isidni(r, bp) + 6*%isidni(r, si) + 7*%isidni(r, di))
%macro reginstr 4
%if is_gpr(%3) && is_gpr(%4)
db %2, 0xc0 | (num_gpr(%3) << 3) | (num_gpr(%4))
%else
%1 %3, %4
%endif
%endm
%macro add 2
reginstr %?, 0x03, %1, %2
%endm
%macro or 2
reginstr %?, 0x0b, %1, %2
%endm
%macro adc 2
reginstr %?, 0x13, %1, %2
%endm
%macro sbb 2
reginstr %?, 0x1b, %1, %2
%endm
%macro and 2
reginstr %?, 0x23, %1, %2
%endm
%macro sub 2
reginstr %?, 0x2b, %1, %2
%endm
%macro xor 2
reginstr %?, 0x33, %1, %2
%endm
%macro cmp 2
reginstr %?, 0x3b, %1, %2
%endm
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment