aboutsummaryrefslogtreecommitdiff
path: root/modules/objfmts/win64
diff options
context:
space:
mode:
Diffstat (limited to 'modules/objfmts/win64')
-rw-r--r--modules/objfmts/win64/Makefile.inc7
-rw-r--r--modules/objfmts/win64/tests/Makefile.inc35
-rw-r--r--modules/objfmts/win64/tests/gas/Makefile.inc5
-rw-r--r--modules/objfmts/win64/tests/gas/win64-gas-sce.asm11
-rw-r--r--modules/objfmts/win64/tests/gas/win64-gas-sce.hex399
-rwxr-xr-xmodules/objfmts/win64/tests/gas/win64_gas_test.sh3
-rw-r--r--modules/objfmts/win64/tests/sce1-err.asm36
-rw-r--r--modules/objfmts/win64/tests/sce1-err.errwarn8
-rw-r--r--modules/objfmts/win64/tests/sce1.asm44
-rw-r--r--modules/objfmts/win64/tests/sce1.hex430
-rw-r--r--modules/objfmts/win64/tests/sce2-err.asm3
-rw-r--r--modules/objfmts/win64/tests/sce2-err.errwarn2
-rw-r--r--modules/objfmts/win64/tests/sce2.asm29
-rw-r--r--modules/objfmts/win64/tests/sce2.hex717
-rw-r--r--modules/objfmts/win64/tests/sce3.asm73
-rw-r--r--modules/objfmts/win64/tests/sce3.hex859
-rw-r--r--modules/objfmts/win64/tests/sce3.masm74
-rw-r--r--modules/objfmts/win64/tests/sce4-err.asm24
-rw-r--r--modules/objfmts/win64/tests/sce4-err.errwarn9
-rw-r--r--modules/objfmts/win64/tests/sce4.asm30
-rw-r--r--modules/objfmts/win64/tests/sce4.hex652
-rw-r--r--modules/objfmts/win64/tests/sce4.masm36
-rw-r--r--modules/objfmts/win64/tests/win64-abs.asm1
-rw-r--r--modules/objfmts/win64/tests/win64-abs.hex171
-rw-r--r--modules/objfmts/win64/tests/win64-curpos.asm27
-rw-r--r--modules/objfmts/win64/tests/win64-curpos.hex499
-rw-r--r--modules/objfmts/win64/tests/win64-dataref.asm151
-rw-r--r--modules/objfmts/win64/tests/win64-dataref.hex2479
-rw-r--r--modules/objfmts/win64/tests/win64-dataref.masm139
-rw-r--r--modules/objfmts/win64/tests/win64-dataref2.asm17
-rw-r--r--modules/objfmts/win64/tests/win64-dataref2.hex343
-rw-r--r--modules/objfmts/win64/tests/win64-dataref2.masm17
-rwxr-xr-xmodules/objfmts/win64/tests/win64_test.sh3
33 files changed, 7333 insertions, 0 deletions
diff --git a/modules/objfmts/win64/Makefile.inc b/modules/objfmts/win64/Makefile.inc
new file mode 100644
index 0000000..545c847
--- /dev/null
+++ b/modules/objfmts/win64/Makefile.inc
@@ -0,0 +1,7 @@
+# Assume objfmt_coff is included
+
+YASM_MODULES += objfmt_win64 objfmt_x64
+
+EXTRA_DIST += modules/objfmts/win64/tests/Makefile.inc
+
+include modules/objfmts/win64/tests/Makefile.inc
diff --git a/modules/objfmts/win64/tests/Makefile.inc b/modules/objfmts/win64/tests/Makefile.inc
new file mode 100644
index 0000000..2458426
--- /dev/null
+++ b/modules/objfmts/win64/tests/Makefile.inc
@@ -0,0 +1,35 @@
+TESTS += modules/objfmts/win64/tests/win64_test.sh
+
+EXTRA_DIST += modules/objfmts/win64/tests/win64_test.sh
+EXTRA_DIST += modules/objfmts/win64/tests/sce1.asm
+EXTRA_DIST += modules/objfmts/win64/tests/sce1.hex
+EXTRA_DIST += modules/objfmts/win64/tests/sce1-err.asm
+EXTRA_DIST += modules/objfmts/win64/tests/sce1-err.errwarn
+EXTRA_DIST += modules/objfmts/win64/tests/sce2.asm
+EXTRA_DIST += modules/objfmts/win64/tests/sce2.hex
+EXTRA_DIST += modules/objfmts/win64/tests/sce2-err.asm
+EXTRA_DIST += modules/objfmts/win64/tests/sce2-err.errwarn
+EXTRA_DIST += modules/objfmts/win64/tests/sce3.asm
+EXTRA_DIST += modules/objfmts/win64/tests/sce3.hex
+EXTRA_DIST += modules/objfmts/win64/tests/sce3.masm
+EXTRA_DIST += modules/objfmts/win64/tests/sce4.asm
+EXTRA_DIST += modules/objfmts/win64/tests/sce4.hex
+EXTRA_DIST += modules/objfmts/win64/tests/sce4.masm
+EXTRA_DIST += modules/objfmts/win64/tests/sce4-err.asm
+EXTRA_DIST += modules/objfmts/win64/tests/sce4-err.errwarn
+EXTRA_DIST += modules/objfmts/win64/tests/win64-abs.asm
+EXTRA_DIST += modules/objfmts/win64/tests/win64-abs.hex
+EXTRA_DIST += modules/objfmts/win64/tests/win64-curpos.asm
+EXTRA_DIST += modules/objfmts/win64/tests/win64-curpos.hex
+EXTRA_DIST += modules/objfmts/win64/tests/win64-dataref.asm
+EXTRA_DIST += modules/objfmts/win64/tests/win64-dataref.hex
+EXTRA_DIST += modules/objfmts/win64/tests/win64-dataref.masm
+EXTRA_DIST += modules/objfmts/win64/tests/win64-dataref2.asm
+EXTRA_DIST += modules/objfmts/win64/tests/win64-dataref2.hex
+EXTRA_DIST += modules/objfmts/win64/tests/win64-dataref2.masm
+EXTRA_DIST += modules/objfmts/win64/tests/win64-imagebase.hex
+EXTRA_DIST += modules/objfmts/win64/tests/win64-imagebase.asm
+
+EXTRA_DIST += modules/objfmts/win64/tests/gas/Makefile.inc
+
+include modules/objfmts/win64/tests/gas/Makefile.inc
diff --git a/modules/objfmts/win64/tests/gas/Makefile.inc b/modules/objfmts/win64/tests/gas/Makefile.inc
new file mode 100644
index 0000000..0faeec7
--- /dev/null
+++ b/modules/objfmts/win64/tests/gas/Makefile.inc
@@ -0,0 +1,5 @@
+TESTS += modules/objfmts/win64/tests/gas/win64_gas_test.sh
+
+EXTRA_DIST += modules/objfmts/win64/tests/gas/win64_gas_test.sh
+EXTRA_DIST += modules/objfmts/win64/tests/gas/win64-gas-sce.asm
+EXTRA_DIST += modules/objfmts/win64/tests/gas/win64-gas-sce.hex
diff --git a/modules/objfmts/win64/tests/gas/win64-gas-sce.asm b/modules/objfmts/win64/tests/gas/win64-gas-sce.asm
new file mode 100644
index 0000000..3a75ee4
--- /dev/null
+++ b/modules/objfmts/win64/tests/gas/win64-gas-sce.asm
@@ -0,0 +1,11 @@
+PROC_FRAME sample
+rex_push_reg %rbp
+rex_push_eflags
+alloc_stack 16
+save_reg %rsi, 0x18
+save_xmm128 %xmm7, 0x20
+push_frame 16
+set_frame %rdi
+set_frame %rdi, 16
+END_PROLOGUE
+ENDPROC_FRAME
diff --git a/modules/objfmts/win64/tests/gas/win64-gas-sce.hex b/modules/objfmts/win64/tests/gas/win64-gas-sce.hex
new file mode 100644
index 0000000..4721c51
--- /dev/null
+++ b/modules/objfmts/win64/tests/gas/win64-gas-sce.hex
@@ -0,0 +1,399 @@
+64
+86
+03
+00
+00
+00
+00
+00
+e9
+00
+00
+00
+09
+00
+00
+00
+00
+00
+04
+00
+2e
+74
+65
+78
+74
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+1b
+00
+00
+00
+8c
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+20
+00
+50
+60
+2e
+78
+64
+61
+74
+61
+00
+00
+1b
+00
+00
+00
+00
+00
+00
+00
+18
+00
+00
+00
+a7
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+40
+00
+40
+40
+2e
+70
+64
+61
+74
+61
+00
+00
+33
+00
+00
+00
+00
+00
+00
+00
+0c
+00
+00
+00
+bf
+00
+00
+00
+cb
+00
+00
+00
+00
+00
+00
+00
+03
+00
+00
+00
+40
+00
+30
+40
+48
+55
+48
+9c
+48
+83
+ec
+10
+48
+89
+74
+24
+18
+66
+0f
+7f
+7c
+24
+20
+48
+89
+e7
+48
+8d
+7c
+24
+10
+01
+1b
+0a
+17
+1b
+73
+16
+73
+13
+1a
+13
+78
+02
+00
+0d
+64
+03
+00
+08
+12
+04
+02
+02
+50
+00
+00
+00
+00
+1b
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+04
+00
+00
+00
+03
+00
+04
+00
+00
+00
+04
+00
+00
+00
+03
+00
+08
+00
+00
+00
+05
+00
+00
+00
+03
+00
+2e
+66
+69
+6c
+65
+00
+00
+00
+00
+00
+00
+00
+fe
+ff
+00
+00
+67
+01
+2d
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+2e
+74
+65
+78
+74
+00
+00
+00
+00
+00
+00
+00
+01
+00
+00
+00
+03
+01
+1b
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+73
+61
+6d
+70
+6c
+65
+00
+00
+00
+00
+00
+00
+01
+00
+00
+00
+03
+00
+2e
+78
+64
+61
+74
+61
+00
+00
+00
+00
+00
+00
+02
+00
+00
+00
+03
+01
+18
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+2e
+70
+64
+61
+74
+61
+00
+00
+00
+00
+00
+00
+03
+00
+00
+00
+03
+01
+0c
+00
+00
+00
+03
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+04
+00
+00
+00
diff --git a/modules/objfmts/win64/tests/gas/win64_gas_test.sh b/modules/objfmts/win64/tests/gas/win64_gas_test.sh
new file mode 100755
index 0000000..efc7688
--- /dev/null
+++ b/modules/objfmts/win64/tests/gas/win64_gas_test.sh
@@ -0,0 +1,3 @@
+#! /bin/sh
+${srcdir}/out_test.sh win64_gas_test modules/objfmts/win64/tests/gas "win64 objfmt" "-f win64 -p gas -r nasm" ".obj"
+exit $?
diff --git a/modules/objfmts/win64/tests/sce1-err.asm b/modules/objfmts/win64/tests/sce1-err.asm
new file mode 100644
index 0000000..a356b5e
--- /dev/null
+++ b/modules/objfmts/win64/tests/sce1-err.asm
@@ -0,0 +1,36 @@
+PROC_FRAME sample1
+[pushreg rbp]
+[allocstack 040h]
+[setframe rbp, 020h]
+[savexmm128 xmm7, 020h]
+[savereg rsi, 038h]
+[savereg rdi, 010h]
+;END_PROLOGUE
+ENDPROC_FRAME
+
+PROC_FRAME sample2
+[pushreg rbp]
+[allocstack 040h]
+[setframe rbp, 020h]
+[savexmm128 xmm7, 020h]
+[savereg rsi, 038h]
+[savereg rdi, 010h]
+;END_PROLOGUE
+
+PROC_FRAME sample3
+[pushreg rbp]
+[allocstack 040h]
+[setframe rbp, 020h]
+[savexmm128 xmm7, 020h]
+[savereg rsi, 038h]
+END_PROLOGUE
+[savereg rdi, 010h]
+
+ENDPROC_FRAME
+
+END_PROLOGUE
+[savereg rdi, 010h]
+
+PROC_FRAME sample4
+[pushreg rbp]
+
diff --git a/modules/objfmts/win64/tests/sce1-err.errwarn b/modules/objfmts/win64/tests/sce1-err.errwarn
new file mode 100644
index 0000000..bfb88c1
--- /dev/null
+++ b/modules/objfmts/win64/tests/sce1-err.errwarn
@@ -0,0 +1,8 @@
+-:9: error: ended procedure without ending prologue
+-:1: error: procedure started here
+-:20: error: nested procedures not supported (didn't use [ENDPROC_FRAME]?)
+-:11: error: previous procedure started here
+-:27: error: [SAVEREG] after end of prologue
+-:26: error: prologue ended here
+-:31: error: [ENDPROLOG] without preceding [PROC_FRAME]
+-:32: error: [SAVEREG] without preceding [PROC_FRAME]
diff --git a/modules/objfmts/win64/tests/sce1.asm b/modules/objfmts/win64/tests/sce1.asm
new file mode 100644
index 0000000..a021e82
--- /dev/null
+++ b/modules/objfmts/win64/tests/sce1.asm
@@ -0,0 +1,44 @@
+PROC_FRAME sample
+ db 048h; emit a REX prefix, to enable hot-patching
+push rbp
+[pushreg rbp]
+sub rsp, 040h
+[allocstack 040h]
+lea rbp, [rsp+020h]
+[setframe rbp, 020h]
+movdqa [rbp], xmm7
+[savexmm128 xmm7, 020h];the offset is from the base of the frame
+;not the scaled offset of the frame
+mov [rbp+018h], rsi
+[savereg rsi, 018h]
+mov [rsp+010h], rdi
+[savereg rdi, 010h]; you can still use RSP as the base of the frame
+; or any other register you choose
+END_PROLOGUE
+
+; you can modify the stack pointer outside of the prologue (similar to alloca)
+; because we have a frame pointer.
+; if we didn't have a frame pointer, this would be illegal
+; if we didn't make this modification,
+; there would be no need for a frame pointer
+
+sub rsp, 060h
+
+; we can unwind from the following AV because of the frame pointer
+
+mov rax, 0
+mov rax, [rax] ; AV!
+
+; restore the registers that weren't saved with a push
+; this isn't part of the official epilog, as described in section 2.5
+
+movdqa xmm7, [rbp]
+mov rsi, [rbp+018h]
+mov rdi, [rbp-010h]
+
+; Here's the official epilog
+
+lea rsp, [rbp-020h]
+pop rbp
+ret
+ENDPROC_FRAME
diff --git a/modules/objfmts/win64/tests/sce1.hex b/modules/objfmts/win64/tests/sce1.hex
new file mode 100644
index 0000000..d6b1427
--- /dev/null
+++ b/modules/objfmts/win64/tests/sce1.hex
@@ -0,0 +1,430 @@
+64
+86
+03
+00
+00
+00
+00
+00
+08
+01
+00
+00
+09
+00
+00
+00
+00
+00
+04
+00
+2e
+74
+65
+78
+74
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+3a
+00
+00
+00
+8c
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+20
+00
+50
+60
+2e
+78
+64
+61
+74
+61
+00
+00
+3a
+00
+00
+00
+00
+00
+00
+00
+18
+00
+00
+00
+c6
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+40
+00
+40
+40
+2e
+70
+64
+61
+74
+61
+00
+00
+52
+00
+00
+00
+00
+00
+00
+00
+0c
+00
+00
+00
+de
+00
+00
+00
+ea
+00
+00
+00
+00
+00
+00
+00
+03
+00
+00
+00
+40
+00
+30
+40
+48
+55
+48
+83
+ec
+40
+48
+8d
+6c
+24
+20
+66
+0f
+7f
+7d
+00
+48
+89
+75
+18
+48
+89
+7c
+24
+10
+48
+83
+ec
+60
+48
+c7
+c0
+00
+00
+00
+00
+48
+8b
+00
+66
+0f
+6f
+7d
+00
+48
+8b
+75
+18
+48
+8b
+7d
+f0
+48
+8d
+65
+e0
+5d
+c3
+01
+19
+09
+25
+19
+74
+02
+00
+14
+64
+03
+00
+10
+78
+02
+00
+0b
+53
+06
+72
+02
+50
+00
+00
+00
+00
+00
+00
+3a
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+04
+00
+00
+00
+03
+00
+04
+00
+00
+00
+04
+00
+00
+00
+03
+00
+08
+00
+00
+00
+05
+00
+00
+00
+03
+00
+2e
+66
+69
+6c
+65
+00
+00
+00
+00
+00
+00
+00
+fe
+ff
+00
+00
+67
+01
+2d
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+2e
+74
+65
+78
+74
+00
+00
+00
+00
+00
+00
+00
+01
+00
+00
+00
+03
+01
+3a
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+73
+61
+6d
+70
+6c
+65
+00
+00
+00
+00
+00
+00
+01
+00
+00
+00
+03
+00
+2e
+78
+64
+61
+74
+61
+00
+00
+00
+00
+00
+00
+02
+00
+00
+00
+03
+01
+18
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+2e
+70
+64
+61
+74
+61
+00
+00
+00
+00
+00
+00
+03
+00
+00
+00
+03
+01
+0c
+00
+00
+00
+03
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+04
+00
+00
+00
diff --git a/modules/objfmts/win64/tests/sce2-err.asm b/modules/objfmts/win64/tests/sce2-err.asm
new file mode 100644
index 0000000..b5ce957
--- /dev/null
+++ b/modules/objfmts/win64/tests/sce2-err.asm
@@ -0,0 +1,3 @@
+PROC_FRAME sample4
+[pushreg rbp]
+
diff --git a/modules/objfmts/win64/tests/sce2-err.errwarn b/modules/objfmts/win64/tests/sce2-err.errwarn
new file mode 100644
index 0000000..73e1865
--- /dev/null
+++ b/modules/objfmts/win64/tests/sce2-err.errwarn
@@ -0,0 +1,2 @@
+-: error: end of file in procedure frame
+-:1: error: procedure started here
diff --git a/modules/objfmts/win64/tests/sce2.asm b/modules/objfmts/win64/tests/sce2.asm
new file mode 100644
index 0000000..d76f946
--- /dev/null
+++ b/modules/objfmts/win64/tests/sce2.asm
@@ -0,0 +1,29 @@
+struc kFrame
+.Fill resq 1 ; fill to 8 mod 16
+.SavedRdi resq 1 ; saved register RDI
+.SavedRsi resq 1 ; saved register RSI
+endstruc
+
+struc sampleFrame
+.Fill resq 1 ; fill to 8 mod 16
+.SavedRdi resq 1 ; Saved Register RDI
+.SavedRsi resq 1 ; Saved Register RSI
+endstruc
+
+PROC_FRAME sample2
+alloc_stack sampleFrame_size
+save_reg rdi, sampleFrame.SavedRdi
+save_reg rsi, sampleFrame.SavedRsi
+END_PROLOGUE
+
+; function body
+
+mov rsi, [rsp+sampleFrame.SavedRsi]
+mov rdi, [rsp+sampleFrame.SavedRdi]
+
+; Here's the official epilog
+
+add rsp, sampleFrame_size
+ret
+ENDPROC_FRAME
+
diff --git a/modules/objfmts/win64/tests/sce2.hex b/modules/objfmts/win64/tests/sce2.hex
new file mode 100644
index 0000000..1caa10c
--- /dev/null
+++ b/modules/objfmts/win64/tests/sce2.hex
@@ -0,0 +1,717 @@
+64
+86
+03
+00
+00
+00
+00
+00
+e3
+00
+00
+00
+13
+00
+00
+00
+00
+00
+04
+00
+2e
+74
+65
+78
+74
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+1d
+00
+00
+00
+8c
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+20
+00
+50
+60
+2e
+78
+64
+61
+74
+61
+00
+00
+1d
+00
+00
+00
+00
+00
+00
+00
+10
+00
+00
+00
+a9
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+40
+00
+40
+40
+2e
+70
+64
+61
+74
+61
+00
+00
+2d
+00
+00
+00
+00
+00
+00
+00
+0c
+00
+00
+00
+b9
+00
+00
+00
+c5
+00
+00
+00
+00
+00
+00
+00
+03
+00
+00
+00
+40
+00
+30
+40
+48
+83
+ec
+18
+48
+89
+7c
+24
+08
+48
+89
+74
+24
+10
+48
+8b
+74
+24
+10
+48
+8b
+7c
+24
+08
+48
+83
+c4
+18
+c3
+01
+0e
+05
+00
+0e
+64
+02
+00
+09
+74
+01
+00
+04
+22
+00
+00
+00
+00
+00
+00
+1d
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+0e
+00
+00
+00
+03
+00
+04
+00
+00
+00
+0e
+00
+00
+00
+03
+00
+08
+00
+00
+00
+0f
+00
+00
+00
+03
+00
+2e
+66
+69
+6c
+65
+00
+00
+00
+00
+00
+00
+00
+fe
+ff
+00
+00
+67
+01
+2d
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+2e
+74
+65
+78
+74
+00
+00
+00
+00
+00
+00
+00
+01
+00
+00
+00
+03
+01
+1d
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+6b
+46
+72
+61
+6d
+65
+00
+00
+00
+00
+00
+00
+ff
+ff
+00
+00
+03
+00
+00
+00
+00
+00
+04
+00
+00
+00
+00
+00
+00
+00
+ff
+ff
+00
+00
+03
+00
+00
+00
+00
+00
+10
+00
+00
+00
+08
+00
+00
+00
+ff
+ff
+00
+00
+03
+00
+00
+00
+00
+00
+20
+00
+00
+00
+10
+00
+00
+00
+ff
+ff
+00
+00
+03
+00
+00
+00
+00
+00
+30
+00
+00
+00
+18
+00
+00
+00
+ff
+ff
+00
+00
+03
+00
+00
+00
+00
+00
+3c
+00
+00
+00
+00
+00
+00
+00
+ff
+ff
+00
+00
+03
+00
+00
+00
+00
+00
+48
+00
+00
+00
+00
+00
+00
+00
+ff
+ff
+00
+00
+03
+00
+00
+00
+00
+00
+59
+00
+00
+00
+08
+00
+00
+00
+ff
+ff
+00
+00
+03
+00
+00
+00
+00
+00
+6e
+00
+00
+00
+10
+00
+00
+00
+ff
+ff
+00
+00
+03
+00
+00
+00
+00
+00
+83
+00
+00
+00
+18
+00
+00
+00
+ff
+ff
+00
+00
+03
+00
+73
+61
+6d
+70
+6c
+65
+32
+00
+00
+00
+00
+00
+01
+00
+00
+00
+03
+00
+2e
+78
+64
+61
+74
+61
+00
+00
+00
+00
+00
+00
+02
+00
+00
+00
+03
+01
+10
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+2e
+70
+64
+61
+74
+61
+00
+00
+00
+00
+00
+00
+03
+00
+00
+00
+03
+01
+0c
+00
+00
+00
+03
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+94
+00
+00
+00
+6b
+46
+72
+61
+6d
+65
+2e
+46
+69
+6c
+6c
+00
+6b
+46
+72
+61
+6d
+65
+2e
+53
+61
+76
+65
+64
+52
+64
+69
+00
+6b
+46
+72
+61
+6d
+65
+2e
+53
+61
+76
+65
+64
+52
+73
+69
+00
+6b
+46
+72
+61
+6d
+65
+5f
+73
+69
+7a
+65
+00
+73
+61
+6d
+70
+6c
+65
+46
+72
+61
+6d
+65
+00
+73
+61
+6d
+70
+6c
+65
+46
+72
+61
+6d
+65
+2e
+46
+69
+6c
+6c
+00
+73
+61
+6d
+70
+6c
+65
+46
+72
+61
+6d
+65
+2e
+53
+61
+76
+65
+64
+52
+64
+69
+00
+73
+61
+6d
+70
+6c
+65
+46
+72
+61
+6d
+65
+2e
+53
+61
+76
+65
+64
+52
+73
+69
+00
+73
+61
+6d
+70
+6c
+65
+46
+72
+61
+6d
+65
+5f
+73
+69
+7a
+65
+00
diff --git a/modules/objfmts/win64/tests/sce3.asm b/modules/objfmts/win64/tests/sce3.asm
new file mode 100644
index 0000000..788fe6b
--- /dev/null
+++ b/modules/objfmts/win64/tests/sce3.asm
@@ -0,0 +1,73 @@
+PROC_FRAME sample
+ db 048h; emit a REX prefix, to enable hot-patching
+push rbp
+[pushreg rbp]
+sub rsp, 040h
+[allocstack 040h]
+lea rbp, [rsp+020h]
+[setframe rbp, 020h]
+movdqa [rbp], xmm7
+[savexmm128 xmm7, 020h];the offset is from the base of the frame
+;not the scaled offset of the frame
+mov [rbp+018h], rsi
+[savereg rsi, 018h]
+mov [rsp+010h], rdi
+[savereg rdi, 010h]; you can still use RSP as the base of the frame
+; or any other register you choose
+END_PROLOGUE
+
+; you can modify the stack pointer outside of the prologue (similar to alloca)
+; because we have a frame pointer.
+; if we didn't have a frame pointer, this would be illegal
+; if we didn't make this modification,
+; there would be no need for a frame pointer
+
+sub rsp, 060h
+
+; we can unwind from the following AV because of the frame pointer
+
+mov rax, 0
+mov rax, [rax] ; AV!
+
+; restore the registers that weren't saved with a push
+; this isn't part of the official epilog, as described in section 2.5
+
+movdqa xmm7, [rbp]
+mov rsi, [rbp+018h]
+mov rdi, [rbp-010h]
+
+; Here's the official epilog
+
+lea rsp, [rbp-020h]
+pop rbp
+ret
+ENDPROC_FRAME
+struc kFrame
+.Fill resq 1 ; fill to 8 mod 16
+.SavedRdi resq 1 ; saved register RDI
+.SavedRsi resq 1 ; saved register RSI
+endstruc
+
+struc sampleFrame
+.Fill resq 1 ; fill to 8 mod 16
+.SavedRdi resq 1 ; Saved Register RDI
+.SavedRsi resq 1 ; Saved Register RSI
+endstruc
+
+PROC_FRAME sample2
+alloc_stack sampleFrame_size
+save_reg rdi, sampleFrame.SavedRdi
+save_reg rsi, sampleFrame.SavedRsi
+END_PROLOGUE
+
+; function body
+
+mov rsi, [rsp+sampleFrame.SavedRsi]
+mov rdi, [rsp+sampleFrame.SavedRdi]
+
+; Here's the official epilog
+
+add rsp, sampleFrame_size
+ret
+ENDPROC_FRAME
+
diff --git a/modules/objfmts/win64/tests/sce3.hex b/modules/objfmts/win64/tests/sce3.hex
new file mode 100644
index 0000000..cadf8b9
--- /dev/null
+++ b/modules/objfmts/win64/tests/sce3.hex
@@ -0,0 +1,859 @@
+64
+86
+03
+00
+00
+00
+00
+00
+5f
+01
+00
+00
+14
+00
+00
+00
+00
+00
+04
+00
+2e
+74
+65
+78
+74
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+57
+00
+00
+00
+8c
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+20
+00
+50
+60
+2e
+78
+64
+61
+74
+61
+00
+00
+57
+00
+00
+00
+00
+00
+00
+00
+28
+00
+00
+00
+e3
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+40
+00
+40
+40
+2e
+70
+64
+61
+74
+61
+00
+00
+7f
+00
+00
+00
+00
+00
+00
+00
+18
+00
+00
+00
+0b
+01
+00
+00
+23
+01
+00
+00
+00
+00
+00
+00
+06
+00
+00
+00
+40
+00
+30
+40
+48
+55
+48
+83
+ec
+40
+48
+8d
+6c
+24
+20
+66
+0f
+7f
+7d
+00
+48
+89
+75
+18
+48
+89
+7c
+24
+10
+48
+83
+ec
+60
+48
+c7
+c0
+00
+00
+00
+00
+48
+8b
+00
+66
+0f
+6f
+7d
+00
+48
+8b
+75
+18
+48
+8b
+7d
+f0
+48
+8d
+65
+e0
+5d
+c3
+48
+83
+ec
+18
+48
+89
+7c
+24
+08
+48
+89
+74
+24
+10
+48
+8b
+74
+24
+10
+48
+8b
+7c
+24
+08
+48
+83
+c4
+18
+c3
+01
+19
+09
+25
+19
+74
+02
+00
+14
+64
+03
+00
+10
+78
+02
+00
+0b
+53
+06
+72
+02
+50
+00
+00
+01
+0e
+05
+00
+0e
+64
+02
+00
+09
+74
+01
+00
+04
+22
+00
+00
+00
+00
+00
+00
+3a
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+1d
+00
+00
+00
+18
+00
+00
+00
+00
+00
+00
+00
+04
+00
+00
+00
+03
+00
+04
+00
+00
+00
+04
+00
+00
+00
+03
+00
+08
+00
+00
+00
+05
+00
+00
+00
+03
+00
+0c
+00
+00
+00
+13
+00
+00
+00
+03
+00
+10
+00
+00
+00
+13
+00
+00
+00
+03
+00
+14
+00
+00
+00
+05
+00
+00
+00
+03
+00
+2e
+66
+69
+6c
+65
+00
+00
+00
+00
+00
+00
+00
+fe
+ff
+00
+00
+67
+01
+2d
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+2e
+74
+65
+78
+74
+00
+00
+00
+00
+00
+00
+00
+01
+00
+00
+00
+03
+01
+57
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+73
+61
+6d
+70
+6c
+65
+00
+00
+00
+00
+00
+00
+01
+00
+00
+00
+03
+00
+2e
+78
+64
+61
+74
+61
+00
+00
+00
+00
+00
+00
+02
+00
+00
+00
+03
+01
+28
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+2e
+70
+64
+61
+74
+61
+00
+00
+00
+00
+00
+00
+03
+00
+00
+00
+03
+01
+18
+00
+00
+00
+06
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+6b
+46
+72
+61
+6d
+65
+00
+00
+00
+00
+00
+00
+ff
+ff
+00
+00
+03
+00
+00
+00
+00
+00
+04
+00
+00
+00
+00
+00
+00
+00
+ff
+ff
+00
+00
+03
+00
+00
+00
+00
+00
+10
+00
+00
+00
+08
+00
+00
+00
+ff
+ff
+00
+00
+03
+00
+00
+00
+00
+00
+20
+00
+00
+00
+10
+00
+00
+00
+ff
+ff
+00
+00
+03
+00
+00
+00
+00
+00
+30
+00
+00
+00
+18
+00
+00
+00
+ff
+ff
+00
+00
+03
+00
+00
+00
+00
+00
+3c
+00
+00
+00
+00
+00
+00
+00
+ff
+ff
+00
+00
+03
+00
+00
+00
+00
+00
+48
+00
+00
+00
+00
+00
+00
+00
+ff
+ff
+00
+00
+03
+00
+00
+00
+00
+00
+59
+00
+00
+00
+08
+00
+00
+00
+ff
+ff
+00
+00
+03
+00
+00
+00
+00
+00
+6e
+00
+00
+00
+10
+00
+00
+00
+ff
+ff
+00
+00
+03
+00
+00
+00
+00
+00
+83
+00
+00
+00
+18
+00
+00
+00
+ff
+ff
+00
+00
+03
+00
+73
+61
+6d
+70
+6c
+65
+32
+00
+3a
+00
+00
+00
+01
+00
+00
+00
+03
+00
+94
+00
+00
+00
+6b
+46
+72
+61
+6d
+65
+2e
+46
+69
+6c
+6c
+00
+6b
+46
+72
+61
+6d
+65
+2e
+53
+61
+76
+65
+64
+52
+64
+69
+00
+6b
+46
+72
+61
+6d
+65
+2e
+53
+61
+76
+65
+64
+52
+73
+69
+00
+6b
+46
+72
+61
+6d
+65
+5f
+73
+69
+7a
+65
+00
+73
+61
+6d
+70
+6c
+65
+46
+72
+61
+6d
+65
+00
+73
+61
+6d
+70
+6c
+65
+46
+72
+61
+6d
+65
+2e
+46
+69
+6c
+6c
+00
+73
+61
+6d
+70
+6c
+65
+46
+72
+61
+6d
+65
+2e
+53
+61
+76
+65
+64
+52
+64
+69
+00
+73
+61
+6d
+70
+6c
+65
+46
+72
+61
+6d
+65
+2e
+53
+61
+76
+65
+64
+52
+73
+69
+00
+73
+61
+6d
+70
+6c
+65
+46
+72
+61
+6d
+65
+5f
+73
+69
+7a
+65
+00
diff --git a/modules/objfmts/win64/tests/sce3.masm b/modules/objfmts/win64/tests/sce3.masm
new file mode 100644
index 0000000..7bac248
--- /dev/null
+++ b/modules/objfmts/win64/tests/sce3.masm
@@ -0,0 +1,74 @@
+include macamd64.inc
+
+_TEXT SEGMENT
+sample PROC FRAME
+ db 048h; emit a REX prefix, to enable hot-patching
+push rbp
+.pushreg rbp
+sub rsp, 040h
+.allocstack 040h
+lea rbp, [rsp+020h]
+.setframe rbp, 020h
+movdqa [rbp], xmm7
+.savexmm128 xmm7, 020h;the offset is from the base of the frame
+;not the scaled offset of the frame
+mov [rbp+018h], rsi
+.savereg rsi, 018h
+mov [rsp+010h], rdi
+.savereg rdi, 010h; you can still use RSP as the base of the frame
+; or any other register you choose
+.endprolog
+
+; you can modify the stack pointer outside of the prologue (similar to alloca)
+; because we have a frame pointer.
+; if we didn't have a frame pointer, this would be illegal
+; if we didn't make this modification,
+; there would be no need for a frame pointer
+
+sub rsp, 060h
+
+; we can unwind from the following AV because of the frame pointer
+
+mov rax, 0
+mov rax, [rax] ; AV!
+
+; restore the registers that weren't saved with a push
+; this isn't part of the official epilog, as described in section 2.5
+
+movdqa xmm7, [rbp]
+mov rsi, [rbp+018h]
+mov rdi, [rbp-010h]
+
+; Here's the official epilog
+
+lea rsp, [rbp-020h]
+pop rbp
+ret
+sample ENDP
+
+
+sampleFrame struct
+Fill dq ? ; fill to 8 mod 16
+SavedRdi dq ? ; Saved Register RDI
+SavedRsi dq ? ; Saved Register RSI
+sampleFrame ends
+
+sample2 PROC FRAME
+alloc_stack(sizeof sampleFrame)
+save_reg rdi, sampleFrame.SavedRdi
+save_reg rsi, sampleFrame.SavedRsi
+.endprolog
+
+; function body
+
+mov rsi, sampleFrame.SavedRsi[rsp]
+mov rdi, sampleFrame.SavedRdi[rsp]
+
+; Here's the official epilog
+
+add rsp, (sizeof sampleFrame)
+ret
+sample2 ENDP
+
+_TEXT ENDS
+end
diff --git a/modules/objfmts/win64/tests/sce4-err.asm b/modules/objfmts/win64/tests/sce4-err.asm
new file mode 100644
index 0000000..402f7e9
--- /dev/null
+++ b/modules/objfmts/win64/tests/sce4-err.asm
@@ -0,0 +1,24 @@
+; Negatives
+PROC_FRAME sample
+[allocstack 0-8]
+[setframe rbp, 0-4]
+[savexmm128 xmm7, 0-16]
+[savereg rsi, 0-8]
+END_PROLOGUE
+ENDPROC_FRAME
+
+; Too positive
+PROC_FRAME sample2
+[setframe rbp, 248]
+END_PROLOGUE
+ENDPROC_FRAME
+
+; Misaligned
+PROC_FRAME sample3
+[allocstack 128-4]
+[setframe rbp, 240-4]
+[savexmm128 xmm7, 1024+8]
+[savereg rsi, 1024+4]
+END_PROLOGUE
+ENDPROC_FRAME
+
diff --git a/modules/objfmts/win64/tests/sce4-err.errwarn b/modules/objfmts/win64/tests/sce4-err.errwarn
new file mode 100644
index 0000000..b477ceb
--- /dev/null
+++ b/modules/objfmts/win64/tests/sce4-err.errwarn
@@ -0,0 +1,9 @@
+-:2: error: frame offset of -4 bytes, must be between 0 and 240
+-:3: error: negative offset not allowed
+-:5: error: negative offset not allowed
+-:6: error: negative offset not allowed
+-:11: error: frame offset of 248 bytes, must be between 0 and 240
+-:17: error: frame offset of 236 is not a multiple of 16
+-:18: error: offset of 124 is not a multiple of 8
+-:20: error: offset of 1032 is not a multiple of 16
+-:21: error: offset of 1028 is not a multiple of 8
diff --git a/modules/objfmts/win64/tests/sce4.asm b/modules/objfmts/win64/tests/sce4.asm
new file mode 100644
index 0000000..4072b24
--- /dev/null
+++ b/modules/objfmts/win64/tests/sce4.asm
@@ -0,0 +1,30 @@
+PROC_FRAME sample
+[allocstack 8] ; smallest value
+[setframe rbp, 0] ; smallest value
+[savexmm128 xmm7, 16*64*1024-16]; last smaller-sized
+[savereg rsi, 8*64*1024-8] ; last smaller-sized
+END_PROLOGUE
+ENDPROC_FRAME
+
+PROC_FRAME sample2
+[allocstack 128] ; last smaller-sized
+[setframe rbp, 240] ; largest value
+[savexmm128 xmm7, 16*64*1024] ; first larger-sized
+[savereg rsi, 8*64*1024] ; first larger-sized
+END_PROLOGUE
+ENDPROC_FRAME
+
+PROC_FRAME sample3
+[allocstack 136] ; first medium-sized
+END_PROLOGUE
+ENDPROC_FRAME
+
+PROC_FRAME sample4
+[allocstack 8*64*1024-8] ; last medium-sized
+END_PROLOGUE
+ENDPROC_FRAME
+
+PROC_FRAME sample5
+[allocstack 8*64*1024] ; first larger-sized
+END_PROLOGUE
+ENDPROC_FRAME
diff --git a/modules/objfmts/win64/tests/sce4.hex b/modules/objfmts/win64/tests/sce4.hex
new file mode 100644
index 0000000..9a57d50
--- /dev/null
+++ b/modules/objfmts/win64/tests/sce4.hex
@@ -0,0 +1,652 @@
+64
+86
+03
+00
+00
+00
+00
+00
+9e
+01
+00
+00
+0d
+00
+00
+00
+00
+00
+04
+00
+2e
+74
+65
+78
+74
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+20
+00
+50
+60
+2e
+78
+64
+61
+74
+61
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+40
+00
+00
+00
+8c
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+40
+00
+40
+40
+2e
+70
+64
+61
+74
+61
+00
+00
+40
+00
+00
+00
+00
+00
+00
+00
+3c
+00
+00
+00
+cc
+00
+00
+00
+08
+01
+00
+00
+00
+00
+00
+00
+0f
+00
+00
+00
+40
+00
+30
+40
+01
+00
+06
+05
+00
+64
+ff
+ff
+00
+78
+ff
+ff
+00
+53
+00
+02
+01
+00
+08
+f5
+00
+65
+00
+00
+08
+00
+00
+79
+00
+00
+10
+00
+00
+53
+00
+f2
+01
+00
+02
+00
+00
+01
+11
+00
+01
+00
+02
+00
+00
+01
+ff
+ff
+01
+00
+03
+00
+00
+11
+00
+00
+08
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+10
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+24
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+2c
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+34
+00
+00
+00
+00
+00
+00
+00
+04
+00
+00
+00
+03
+00
+04
+00
+00
+00
+04
+00
+00
+00
+03
+00
+08
+00
+00
+00
+05
+00
+00
+00
+03
+00
+0c
+00
+00
+00
+09
+00
+00
+00
+03
+00
+10
+00
+00
+00
+09
+00
+00
+00
+03
+00
+14
+00
+00
+00
+05
+00
+00
+00
+03
+00
+18
+00
+00
+00
+0a
+00
+00
+00
+03
+00
+1c
+00
+00
+00
+0a
+00
+00
+00
+03
+00
+20
+00
+00
+00
+05
+00
+00
+00
+03
+00
+24
+00
+00
+00
+0b
+00
+00
+00
+03
+00
+28
+00
+00
+00
+0b
+00
+00
+00
+03
+00
+2c
+00
+00
+00
+05
+00
+00
+00
+03
+00
+30
+00
+00
+00
+0c
+00
+00
+00
+03
+00
+34
+00
+00
+00
+0c
+00
+00
+00
+03
+00
+38
+00
+00
+00
+05
+00
+00
+00
+03
+00
+2e
+66
+69
+6c
+65
+00
+00
+00
+00
+00
+00
+00
+fe
+ff
+00
+00
+67
+01
+2d
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+2e
+74
+65
+78
+74
+00
+00
+00
+00
+00
+00
+00
+01
+00
+00
+00
+03
+01
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+73
+61
+6d
+70
+6c
+65
+00
+00
+00
+00
+00
+00
+01
+00
+00
+00
+03
+00
+2e
+78
+64
+61
+74
+61
+00
+00
+00
+00
+00
+00
+02
+00
+00
+00
+03
+01
+40
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+2e
+70
+64
+61
+74
+61
+00
+00
+00
+00
+00
+00
+03
+00
+00
+00
+03
+01
+3c
+00
+00
+00
+0f
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+73
+61
+6d
+70
+6c
+65
+32
+00
+00
+00
+00
+00
+01
+00
+00
+00
+03
+00
+73
+61
+6d
+70
+6c
+65
+33
+00
+00
+00
+00
+00
+01
+00
+00
+00
+03
+00
+73
+61
+6d
+70
+6c
+65
+34
+00
+00
+00
+00
+00
+01
+00
+00
+00
+03
+00
+73
+61
+6d
+70
+6c
+65
+35
+00
+00
+00
+00
+00
+01
+00
+00
+00
+03
+00
+04
+00
+00
+00
diff --git a/modules/objfmts/win64/tests/sce4.masm b/modules/objfmts/win64/tests/sce4.masm
new file mode 100644
index 0000000..1ffbf2f
--- /dev/null
+++ b/modules/objfmts/win64/tests/sce4.masm
@@ -0,0 +1,36 @@
+
+_TEXT SEGMENT
+
+sample PROC FRAME
+.allocstack 8 ; smallest value
+.setframe rbp, 0 ; smallest value
+.savexmm128 xmm7, 16*64*1024-16 ; last smaller-sized
+.savereg rsi, 8*64*1024-8 ; last smaller-sized
+.endprolog
+sample ENDP
+
+sample2 PROC FRAME
+.allocstack 128 ; last smaller-sized
+.setframe rbp, 240 ; largest value
+.savexmm128 xmm7, 16*64*1024 ; first larger-sized
+.savereg rsi, 8*64*1024 ; first larger-sized
+.endprolog
+sample2 ENDP
+
+sample3 PROC FRAME
+.allocstack 136 ; first medium-sized
+.endprolog
+sample3 ENDP
+
+sample4 PROC FRAME
+.allocstack 8*64*1024-8 ; last medium-sized
+.endprolog
+sample4 ENDP
+
+sample5 PROC FRAME
+.allocstack 8*64*1024 ; first larger-sized
+.endprolog
+sample5 ENDP
+
+_TEXT ENDS
+end
diff --git a/modules/objfmts/win64/tests/win64-abs.asm b/modules/objfmts/win64/tests/win64-abs.asm
new file mode 100644
index 0000000..b5c29ea
--- /dev/null
+++ b/modules/objfmts/win64/tests/win64-abs.asm
@@ -0,0 +1 @@
+mov rax, [rel 0x1000]
diff --git a/modules/objfmts/win64/tests/win64-abs.hex b/modules/objfmts/win64/tests/win64-abs.hex
new file mode 100644
index 0000000..7d4b35e
--- /dev/null
+++ b/modules/objfmts/win64/tests/win64-abs.hex
@@ -0,0 +1,171 @@
+64
+86
+01
+00
+00
+00
+00
+00
+4d
+00
+00
+00
+05
+00
+00
+00
+00
+00
+04
+00
+2e
+74
+65
+78
+74
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+07
+00
+00
+00
+3c
+00
+00
+00
+43
+00
+00
+00
+00
+00
+00
+00
+01
+00
+00
+00
+20
+00
+50
+60
+48
+8b
+05
+00
+10
+00
+00
+03
+00
+00
+00
+04
+00
+00
+00
+04
+00
+2e
+66
+69
+6c
+65
+00
+00
+00
+00
+00
+00
+00
+fe
+ff
+00
+00
+67
+01
+2d
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+2e
+74
+65
+78
+74
+00
+00
+00
+00
+00
+00
+00
+01
+00
+00
+00
+03
+01
+07
+00
+00
+00
+01
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+2e
+61
+62
+73
+6f
+6c
+75
+74
+00
+00
+00
+00
+ff
+ff
+00
+00
+03
+00
+04
+00
+00
+00
diff --git a/modules/objfmts/win64/tests/win64-curpos.asm b/modules/objfmts/win64/tests/win64-curpos.asm
new file mode 100644
index 0000000..4599e9c
--- /dev/null
+++ b/modules/objfmts/win64/tests/win64-curpos.asm
@@ -0,0 +1,27 @@
+global bar
+global foo
+
+section .bar
+bar:
+dd foo-$
+dd baz-$
+call foo
+call baz
+foo:
+
+section .data
+baz:
+dd foo-$
+;dd $-foo ; illegal
+dd baz-$
+dd $-baz
+dd foo+4-$ ; with constant
+dd $-baz+foo+4-$ ; both local and cross-segment (legal)
+dd baz+foo+4-$-$ ; ditto, slightly different
+;dd (bar-$)+(foo-$) ; illegal (too many cross-segment)
+dd baz-$+baz-$ ; two from same segment
+
+section .text
+mov dword [foo-$], 5
+mov eax, foo-$
+call foo
diff --git a/modules/objfmts/win64/tests/win64-curpos.hex b/modules/objfmts/win64/tests/win64-curpos.hex
new file mode 100644
index 0000000..d7c51b1
--- /dev/null
+++ b/modules/objfmts/win64/tests/win64-curpos.hex
@@ -0,0 +1,499 @@
+64
+86
+03
+00
+00
+00
+00
+00
+29
+01
+00
+00
+0b
+00
+00
+00
+00
+00
+04
+00
+2e
+74
+65
+78
+74
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+15
+00
+00
+00
+8c
+00
+00
+00
+a1
+00
+00
+00
+00
+00
+00
+00
+03
+00
+00
+00
+20
+00
+50
+60
+2e
+62
+61
+72
+00
+00
+00
+00
+15
+00
+00
+00
+00
+00
+00
+00
+12
+00
+00
+00
+bf
+00
+00
+00
+d1
+00
+00
+00
+00
+00
+00
+00
+02
+00
+00
+00
+20
+00
+00
+60
+2e
+64
+61
+74
+61
+00
+00
+00
+27
+00
+00
+00
+00
+00
+00
+00
+1c
+00
+00
+00
+e5
+00
+00
+00
+01
+01
+00
+00
+00
+00
+00
+00
+04
+00
+00
+00
+40
+00
+50
+c0
+c7
+04
+25
+07
+00
+00
+00
+05
+00
+00
+00
+b8
+05
+00
+00
+00
+e8
+00
+00
+00
+00
+03
+00
+00
+00
+05
+00
+00
+00
+04
+00
+0c
+00
+00
+00
+05
+00
+00
+00
+04
+00
+11
+00
+00
+00
+05
+00
+00
+00
+04
+00
+12
+00
+00
+00
+04
+00
+00
+00
+e8
+05
+00
+00
+00
+e8
+00
+00
+00
+00
+04
+00
+00
+00
+08
+00
+00
+00
+04
+00
+0e
+00
+00
+00
+08
+00
+00
+00
+04
+00
+04
+00
+00
+00
+fc
+ff
+ff
+ff
+08
+00
+00
+00
+08
+00
+00
+00
+18
+00
+00
+00
+f4
+ff
+ff
+ff
+d0
+ff
+ff
+ff
+00
+00
+00
+00
+05
+00
+00
+00
+04
+00
+0c
+00
+00
+00
+05
+00
+00
+00
+04
+00
+10
+00
+00
+00
+05
+00
+00
+00
+04
+00
+14
+00
+00
+00
+05
+00
+00
+00
+04
+00
+2e
+66
+69
+6c
+65
+00
+00
+00
+00
+00
+00
+00
+fe
+ff
+00
+00
+67
+01
+2d
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+2e
+74
+65
+78
+74
+00
+00
+00
+00
+00
+00
+00
+01
+00
+00
+00
+03
+01
+15
+00
+00
+00
+03
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+62
+61
+72
+00
+00
+00
+00
+00
+00
+00
+00
+00
+02
+00
+00
+00
+02
+00
+66
+6f
+6f
+00
+00
+00
+00
+00
+12
+00
+00
+00
+02
+00
+00
+00
+02
+00
+2e
+62
+61
+72
+00
+00
+00
+00
+00
+00
+00
+00
+02
+00
+00
+00
+03
+01
+12
+00
+00
+00
+02
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+62
+61
+7a
+00
+00
+00
+00
+00
+00
+00
+00
+00
+03
+00
+00
+00
+03
+00
+2e
+64
+61
+74
+61
+00
+00
+00
+00
+00
+00
+00
+03
+00
+00
+00
+03
+01
+1c
+00
+00
+00
+04
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+04
+00
+00
+00
diff --git a/modules/objfmts/win64/tests/win64-dataref.asm b/modules/objfmts/win64/tests/win64-dataref.asm
new file mode 100644
index 0000000..d863dc5
--- /dev/null
+++ b/modules/objfmts/win64/tests/win64-dataref.asm
@@ -0,0 +1,151 @@
+BITS 64
+
+global x86ident
+global __savident
+extern foobar ; :proc
+extern foobar2 ; :abs
+extern foobar3 ; :qword
+extern foobar4 ; :byte
+
+[SECTION .data]
+__savident dd 0
+savidentptr dd __savident
+savidentptr2 dq __savident
+x86identptr dd x86ident
+x86identptr2 dq x86ident
+foobarptr dd foobar
+foobarptr2 dq foobar
+foobar2ptr dd foobar2
+foobar2ptr2 dq foobar2
+foobar3ptr dd foobar3
+foobar3ptr2 dq foobar3
+xptr dd x
+xptr2 dq x
+
+[SECTION .bss]
+x resq 1
+y resq 1
+
+[SECTION .text]
+x86ident:
+ ; extern with :proc
+ ; This instruction generates a different relocation than
+ ; MASM does at present.
+ mov ebx, foobar ; WTF ML64.. this had []
+ mov rcx, qword foobar
+ lea rdx, [foobar wrt rip]
+ mov rax, [foobar+rcx]
+ mov rax, qword foobar
+ mov rbx, qword foobar
+ movzx rax, byte [foobar wrt rip]
+ movzx rax, byte [foobar+rax]
+
+ ; local "proc"
+ ; See note above
+ mov ebx, trap
+ mov rcx, qword trap
+ ; MASM generates a REL32 reloc for this even though it's in
+ ; the same section. I don't know why, as the call instruction
+ ; below doesn't cause a reloc, so the linker can't be moving
+ ; functions around within an object!
+ lea rdx, [trap wrt rip]
+ mov rax, [trap+rcx]
+ mov rax, qword trap
+ mov rbx, qword trap
+ ; MASM generates a REL32 reloc for this even though it's in
+ ; the same section. I don't know why, as the call instruction
+ ; below doesn't cause a reloc, so the linker can't be moving
+ ; functions around within an object!
+ movzx rax, byte [trap wrt rip]
+ movzx rax, byte [trap+rax]
+
+ ; with :abs
+ ;mov ebx,[foobar2]
+ ;mov rcx,offset foobar2
+ ;lea rdx, foobar2
+ ;mov rax, qword ptr foobar2[rcx]
+ ;mov rax, foobar2
+ ;mov rbx, foobar2
+ ;movzx rax, byte ptr foobar2
+ ;movzx rax, byte ptr foobar2[rax]
+
+ ; with :qword
+ ; See note above
+ mov ebx, foobar3
+ mov ebx, [foobar3 wrt rip]
+ mov rcx, qword foobar3
+ lea rdx, [foobar3 wrt rip]
+ mov rax, [foobar3+rcx]
+ mov rax, [foobar3 wrt rip]
+ mov rbx, [foobar3 wrt rip]
+ movzx rax, byte [foobar3 wrt rip]
+ movzx rax, byte [foobar3+rax]
+
+ ; local var (dword)
+ ; See note above
+ mov ebx, __savident
+ mov ebx,[__savident wrt rip]
+ mov rcx, qword __savident
+ lea rdx, [__savident wrt rip]
+ mov rax, [__savident+rcx]
+ mov rax, [__savident wrt rip]
+ mov rbx, [__savident wrt rip]
+ movzx rax, byte [__savident wrt rip]
+ movzx rax, byte [__savident+rax]
+
+ ; local var (qword)
+ ; See note above
+ mov ebx, savidentptr2
+ mov ebx, [savidentptr2 wrt rip]
+ mov rcx, qword savidentptr2
+ lea rdx, [savidentptr2 wrt rip]
+ mov rax, [savidentptr2+rcx]
+ mov rax, [savidentptr2 wrt rip]
+ mov rbx, [savidentptr2 wrt rip]
+ movzx rax, byte [savidentptr2 wrt rip]
+ movzx rax, byte [savidentptr2+rax]
+
+ ; bss local var (qword)
+ ; See note above
+ mov ebx, y
+ mov ebx, [y wrt rip]
+ mov rcx, qword y
+ lea rdx, [y wrt rip]
+ mov rax, [y+rcx]
+ mov rax, [y wrt rip]
+ mov rbx, [y wrt rip]
+ movzx rax, byte [y wrt rip]
+ movzx rax, byte [y+rax]
+
+ call foobar
+
+ call trap
+
+ ret
+
+trap: sub rsp, 256
+ int3
+ add rsp, 256
+.end
+
+[SECTION .pdata]
+dd trap
+dd trap.end wrt trap
+dd $$xdatasym
+
+[SECTION .xdata]
+$$xdatasym:
+db 1, 7, 2, 0, 7, 1, 0x20, 0
+
+[SECTION _FOO]
+foo_foobar3ptr dd foobar3
+foo_foobar3ptr2 dq foobar3
+ mov ebx, [foobar3 wrt rip]
+ mov rcx, qword foobar3
+ lea rdx, [foobar3 wrt rip]
+ mov rax, [foobar3+rcx]
+ mov rax, [foobar3 wrt rip]
+ mov rbx, [foobar3 wrt rip]
+ movzx rax, byte [foobar3 wrt rip]
+ movzx rax, byte [foobar3+rax]
+
diff --git a/modules/objfmts/win64/tests/win64-dataref.hex b/modules/objfmts/win64/tests/win64-dataref.hex
new file mode 100644
index 0000000..fa604a6
--- /dev/null
+++ b/modules/objfmts/win64/tests/win64-dataref.hex
@@ -0,0 +1,2479 @@
+64
+86
+06
+00
+00
+00
+00
+00
+44
+06
+00
+00
+27
+00
+00
+00
+00
+00
+04
+00
+2e
+74
+65
+78
+74
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+a0
+01
+00
+00
+04
+01
+00
+00
+a4
+02
+00
+00
+00
+00
+00
+00
+33
+00
+00
+00
+20
+00
+50
+60
+2e
+64
+61
+74
+61
+00
+00
+00
+a0
+01
+00
+00
+00
+00
+00
+00
+4c
+00
+00
+00
+a2
+04
+00
+00
+ee
+04
+00
+00
+00
+00
+00
+00
+0c
+00
+00
+00
+40
+00
+50
+c0
+2e
+62
+73
+73
+00
+00
+00
+00
+ec
+01
+00
+00
+00
+00
+00
+00
+10
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+80
+00
+50
+c0
+2e
+70
+64
+61
+74
+61
+00
+00
+fc
+01
+00
+00
+00
+00
+00
+00
+0c
+00
+00
+00
+66
+05
+00
+00
+72
+05
+00
+00
+00
+00
+00
+00
+03
+00
+00
+00
+40
+00
+30
+40
+2e
+78
+64
+61
+74
+61
+00
+00
+08
+02
+00
+00
+00
+00
+00
+00
+08
+00
+00
+00
+90
+05
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+40
+00
+40
+40
+5f
+46
+4f
+4f
+00
+00
+00
+00
+10
+02
+00
+00
+00
+00
+00
+00
+48
+00
+00
+00
+98
+05
+00
+00
+e0
+05
+00
+00
+00
+00
+00
+00
+0a
+00
+00
+00
+20
+00
+00
+60
+bb
+00
+00
+00
+00
+48
+b9
+00
+00
+00
+00
+00
+00
+00
+00
+48
+8d
+15
+00
+00
+00
+00
+48
+8b
+81
+00
+00
+00
+00
+48
+b8
+00
+00
+00
+00
+00
+00
+00
+00
+48
+bb
+00
+00
+00
+00
+00
+00
+00
+00
+48
+0f
+b6
+05
+00
+00
+00
+00
+48
+0f
+b6
+80
+00
+00
+00
+00
+bb
+00
+00
+00
+00
+48
+b9
+00
+00
+00
+00
+00
+00
+00
+00
+48
+8d
+15
+3a
+01
+00
+00
+48
+8b
+81
+00
+00
+00
+00
+48
+b8
+00
+00
+00
+00
+00
+00
+00
+00
+48
+bb
+00
+00
+00
+00
+00
+00
+00
+00
+48
+0f
+b6
+05
+17
+01
+00
+00
+48
+0f
+b6
+80
+00
+00
+00
+00
+bb
+00
+00
+00
+00
+8b
+1d
+00
+00
+00
+00
+48
+b9
+00
+00
+00
+00
+00
+00
+00
+00
+48
+8d
+15
+00
+00
+00
+00
+48
+8b
+81
+00
+00
+00
+00
+48
+8b
+05
+00
+00
+00
+00
+48
+8b
+1d
+00
+00
+00
+00
+48
+0f
+b6
+05
+00
+00
+00
+00
+48
+0f
+b6
+80
+00
+00
+00
+00
+bb
+00
+00
+00
+00
+8b
+1d
+00
+00
+00
+00
+48
+b9
+00
+00
+00
+00
+00
+00
+00
+00
+48
+8d
+15
+00
+00
+00
+00
+48
+8b
+81
+00
+00
+00
+00
+48
+8b
+05
+00
+00
+00
+00
+48
+8b
+1d
+00
+00
+00
+00
+48
+0f
+b6
+05
+00
+00
+00
+00
+48
+0f
+b6
+80
+00
+00
+00
+00
+bb
+00
+00
+00
+00
+8b
+1d
+00
+00
+00
+00
+48
+b9
+00
+00
+00
+00
+00
+00
+00
+00
+48
+8d
+15
+00
+00
+00
+00
+48
+8b
+81
+00
+00
+00
+00
+48
+8b
+05
+00
+00
+00
+00
+48
+8b
+1d
+00
+00
+00
+00
+48
+0f
+b6
+05
+00
+00
+00
+00
+48
+0f
+b6
+80
+00
+00
+00
+00
+bb
+00
+00
+00
+00
+8b
+1d
+00
+00
+00
+00
+48
+b9
+00
+00
+00
+00
+00
+00
+00
+00
+48
+8d
+15
+00
+00
+00
+00
+48
+8b
+81
+00
+00
+00
+00
+48
+8b
+05
+00
+00
+00
+00
+48
+8b
+1d
+00
+00
+00
+00
+48
+0f
+b6
+05
+00
+00
+00
+00
+48
+0f
+b6
+80
+00
+00
+00
+00
+e8
+00
+00
+00
+00
+e8
+01
+00
+00
+00
+c3
+48
+81
+ec
+00
+01
+00
+00
+cc
+48
+81
+c4
+00
+01
+00
+00
+01
+00
+00
+00
+06
+00
+00
+00
+02
+00
+07
+00
+00
+00
+06
+00
+00
+00
+01
+00
+12
+00
+00
+00
+06
+00
+00
+00
+04
+00
+19
+00
+00
+00
+06
+00
+00
+00
+02
+00
+1f
+00
+00
+00
+06
+00
+00
+00
+01
+00
+29
+00
+00
+00
+06
+00
+00
+00
+01
+00
+35
+00
+00
+00
+06
+00
+00
+00
+04
+00
+3d
+00
+00
+00
+06
+00
+00
+00
+02
+00
+42
+00
+00
+00
+1c
+00
+00
+00
+02
+00
+48
+00
+00
+00
+1c
+00
+00
+00
+01
+00
+5a
+00
+00
+00
+1c
+00
+00
+00
+02
+00
+60
+00
+00
+00
+1c
+00
+00
+00
+01
+00
+6a
+00
+00
+00
+1c
+00
+00
+00
+01
+00
+7e
+00
+00
+00
+1c
+00
+00
+00
+02
+00
+83
+00
+00
+00
+08
+00
+00
+00
+02
+00
+89
+00
+00
+00
+08
+00
+00
+00
+04
+00
+8f
+00
+00
+00
+08
+00
+00
+00
+01
+00
+9a
+00
+00
+00
+08
+00
+00
+00
+04
+00
+a1
+00
+00
+00
+08
+00
+00
+00
+02
+00
+a8
+00
+00
+00
+08
+00
+00
+00
+04
+00
+af
+00
+00
+00
+08
+00
+00
+00
+04
+00
+b7
+00
+00
+00
+08
+00
+00
+00
+04
+00
+bf
+00
+00
+00
+08
+00
+00
+00
+02
+00
+c4
+00
+00
+00
+05
+00
+00
+00
+02
+00
+ca
+00
+00
+00
+05
+00
+00
+00
+04
+00
+d0
+00
+00
+00
+05
+00
+00
+00
+01
+00
+db
+00
+00
+00
+05
+00
+00
+00
+04
+00
+e2
+00
+00
+00
+05
+00
+00
+00
+02
+00
+e9
+00
+00
+00
+05
+00
+00
+00
+04
+00
+f0
+00
+00
+00
+05
+00
+00
+00
+04
+00
+f8
+00
+00
+00
+05
+00
+00
+00
+04
+00
+00
+01
+00
+00
+05
+00
+00
+00
+02
+00
+05
+01
+00
+00
+0d
+00
+00
+00
+02
+00
+0b
+01
+00
+00
+0d
+00
+00
+00
+04
+00
+11
+01
+00
+00
+0d
+00
+00
+00
+01
+00
+1c
+01
+00
+00
+0d
+00
+00
+00
+04
+00
+23
+01
+00
+00
+0d
+00
+00
+00
+02
+00
+2a
+01
+00
+00
+0d
+00
+00
+00
+04
+00
+31
+01
+00
+00
+0d
+00
+00
+00
+04
+00
+39
+01
+00
+00
+0d
+00
+00
+00
+04
+00
+41
+01
+00
+00
+0d
+00
+00
+00
+02
+00
+46
+01
+00
+00
+1b
+00
+00
+00
+02
+00
+4c
+01
+00
+00
+1b
+00
+00
+00
+04
+00
+52
+01
+00
+00
+1b
+00
+00
+00
+01
+00
+5d
+01
+00
+00
+1b
+00
+00
+00
+04
+00
+64
+01
+00
+00
+1b
+00
+00
+00
+02
+00
+6b
+01
+00
+00
+1b
+00
+00
+00
+04
+00
+72
+01
+00
+00
+1b
+00
+00
+00
+04
+00
+7a
+01
+00
+00
+1b
+00
+00
+00
+04
+00
+82
+01
+00
+00
+1b
+00
+00
+00
+02
+00
+87
+01
+00
+00
+06
+00
+00
+00
+04
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+04
+00
+00
+00
+05
+00
+00
+00
+02
+00
+08
+00
+00
+00
+05
+00
+00
+00
+01
+00
+10
+00
+00
+00
+04
+00
+00
+00
+02
+00
+14
+00
+00
+00
+04
+00
+00
+00
+01
+00
+1c
+00
+00
+00
+06
+00
+00
+00
+02
+00
+20
+00
+00
+00
+06
+00
+00
+00
+01
+00
+28
+00
+00
+00
+07
+00
+00
+00
+02
+00
+2c
+00
+00
+00
+07
+00
+00
+00
+01
+00
+34
+00
+00
+00
+08
+00
+00
+00
+02
+00
+38
+00
+00
+00
+08
+00
+00
+00
+01
+00
+40
+00
+00
+00
+16
+00
+00
+00
+02
+00
+44
+00
+00
+00
+16
+00
+00
+00
+01
+00
+00
+00
+00
+00
+0f
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+1c
+00
+00
+00
+03
+00
+04
+00
+00
+00
+1c
+00
+00
+00
+03
+00
+08
+00
+00
+00
+20
+00
+00
+00
+03
+00
+01
+07
+02
+00
+07
+01
+20
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+8b
+1d
+00
+00
+00
+00
+48
+b9
+00
+00
+00
+00
+00
+00
+00
+00
+48
+8d
+15
+00
+00
+00
+00
+48
+8b
+81
+00
+00
+00
+00
+48
+8b
+05
+00
+00
+00
+00
+48
+8b
+1d
+00
+00
+00
+00
+48
+0f
+b6
+05
+00
+00
+00
+00
+48
+0f
+b6
+80
+00
+00
+00
+00
+00
+00
+00
+00
+08
+00
+00
+00
+02
+00
+04
+00
+00
+00
+08
+00
+00
+00
+01
+00
+0e
+00
+00
+00
+08
+00
+00
+00
+04
+00
+14
+00
+00
+00
+08
+00
+00
+00
+01
+00
+1f
+00
+00
+00
+08
+00
+00
+00
+04
+00
+26
+00
+00
+00
+08
+00
+00
+00
+02
+00
+2d
+00
+00
+00
+08
+00
+00
+00
+04
+00
+34
+00
+00
+00
+08
+00
+00
+00
+04
+00
+3c
+00
+00
+00
+08
+00
+00
+00
+04
+00
+44
+00
+00
+00
+08
+00
+00
+00
+02
+00
+2e
+66
+69
+6c
+65
+00
+00
+00
+00
+00
+00
+00
+fe
+ff
+00
+00
+67
+01
+2d
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+2e
+74
+65
+78
+74
+00
+00
+00
+00
+00
+00
+00
+01
+00
+00
+00
+03
+01
+a0
+01
+00
+00
+33
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+78
+38
+36
+69
+64
+65
+6e
+74
+00
+00
+00
+00
+01
+00
+00
+00
+02
+00
+00
+00
+00
+00
+04
+00
+00
+00
+00
+00
+00
+00
+02
+00
+00
+00
+02
+00
+66
+6f
+6f
+62
+61
+72
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+02
+00
+66
+6f
+6f
+62
+61
+72
+32
+00
+00
+00
+00
+00
+00
+00
+00
+00
+02
+00
+66
+6f
+6f
+62
+61
+72
+33
+00
+00
+00
+00
+00
+00
+00
+00
+00
+02
+00
+66
+6f
+6f
+62
+61
+72
+34
+00
+00
+00
+00
+00
+00
+00
+00
+00
+02
+00
+2e
+64
+61
+74
+61
+00
+00
+00
+00
+00
+00
+00
+02
+00
+00
+00
+03
+01
+4c
+00
+00
+00
+0c
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+0f
+00
+00
+00
+04
+00
+00
+00
+02
+00
+00
+00
+03
+00
+00
+00
+00
+00
+1b
+00
+00
+00
+08
+00
+00
+00
+02
+00
+00
+00
+03
+00
+00
+00
+00
+00
+28
+00
+00
+00
+10
+00
+00
+00
+02
+00
+00
+00
+03
+00
+00
+00
+00
+00
+34
+00
+00
+00
+14
+00
+00
+00
+02
+00
+00
+00
+03
+00
+00
+00
+00
+00
+41
+00
+00
+00
+1c
+00
+00
+00
+02
+00
+00
+00
+03
+00
+00
+00
+00
+00
+4b
+00
+00
+00
+20
+00
+00
+00
+02
+00
+00
+00
+03
+00
+00
+00
+00
+00
+56
+00
+00
+00
+28
+00
+00
+00
+02
+00
+00
+00
+03
+00
+00
+00
+00
+00
+61
+00
+00
+00
+2c
+00
+00
+00
+02
+00
+00
+00
+03
+00
+00
+00
+00
+00
+6d
+00
+00
+00
+34
+00
+00
+00
+02
+00
+00
+00
+03
+00
+00
+00
+00
+00
+78
+00
+00
+00
+38
+00
+00
+00
+02
+00
+00
+00
+03
+00
+78
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+03
+00
+00
+00
+03
+00
+78
+70
+74
+72
+00
+00
+00
+00
+40
+00
+00
+00
+02
+00
+00
+00
+03
+00
+78
+70
+74
+72
+32
+00
+00
+00
+44
+00
+00
+00
+02
+00
+00
+00
+03
+00
+2e
+62
+73
+73
+00
+00
+00
+00
+00
+00
+00
+00
+03
+00
+00
+00
+03
+01
+10
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+79
+00
+00
+00
+00
+00
+00
+00
+08
+00
+00
+00
+03
+00
+00
+00
+03
+00
+74
+72
+61
+70
+00
+00
+00
+00
+91
+01
+00
+00
+01
+00
+00
+00
+03
+00
+74
+72
+61
+70
+2e
+65
+6e
+64
+a0
+01
+00
+00
+01
+00
+00
+00
+03
+00
+2e
+70
+64
+61
+74
+61
+00
+00
+00
+00
+00
+00
+04
+00
+00
+00
+03
+01
+0c
+00
+00
+00
+03
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+84
+00
+00
+00
+00
+00
+00
+00
+05
+00
+00
+00
+03
+00
+2e
+78
+64
+61
+74
+61
+00
+00
+00
+00
+00
+00
+05
+00
+00
+00
+03
+01
+08
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+5f
+46
+4f
+4f
+00
+00
+00
+00
+00
+00
+00
+00
+06
+00
+00
+00
+03
+01
+48
+00
+00
+00
+0a
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+8e
+00
+00
+00
+00
+00
+00
+00
+06
+00
+00
+00
+03
+00
+00
+00
+00
+00
+9d
+00
+00
+00
+04
+00
+00
+00
+06
+00
+00
+00
+03
+00
+ad
+00
+00
+00
+5f
+5f
+73
+61
+76
+69
+64
+65
+6e
+74
+00
+73
+61
+76
+69
+64
+65
+6e
+74
+70
+74
+72
+00
+73
+61
+76
+69
+64
+65
+6e
+74
+70
+74
+72
+32
+00
+78
+38
+36
+69
+64
+65
+6e
+74
+70
+74
+72
+00
+78
+38
+36
+69
+64
+65
+6e
+74
+70
+74
+72
+32
+00
+66
+6f
+6f
+62
+61
+72
+70
+74
+72
+00
+66
+6f
+6f
+62
+61
+72
+70
+74
+72
+32
+00
+66
+6f
+6f
+62
+61
+72
+32
+70
+74
+72
+00
+66
+6f
+6f
+62
+61
+72
+32
+70
+74
+72
+32
+00
+66
+6f
+6f
+62
+61
+72
+33
+70
+74
+72
+00
+66
+6f
+6f
+62
+61
+72
+33
+70
+74
+72
+32
+00
+24
+78
+64
+61
+74
+61
+73
+79
+6d
+00
+66
+6f
+6f
+5f
+66
+6f
+6f
+62
+61
+72
+33
+70
+74
+72
+00
+66
+6f
+6f
+5f
+66
+6f
+6f
+62
+61
+72
+33
+70
+74
+72
+32
+00
diff --git a/modules/objfmts/win64/tests/win64-dataref.masm b/modules/objfmts/win64/tests/win64-dataref.masm
new file mode 100644
index 0000000..63042be
--- /dev/null
+++ b/modules/objfmts/win64/tests/win64-dataref.masm
@@ -0,0 +1,139 @@
+public x86ident
+public __savident
+extrn foobar : proc
+extrn foobar2 : abs
+extrn foobar3 : qword
+extrn foobar4 : byte
+
+_DATA SEGMENT
+__savident dd 0
+savidentptr dd __savident
+savidentptr2 dq __savident
+x86identptr dd x86ident
+x86identptr2 dq x86ident
+foobarptr dd foobar
+foobarptr2 dq foobar
+foobar2ptr dd foobar2
+foobar2ptr2 dq foobar2
+foobar3ptr dd foobar3
+foobar3ptr2 dq foobar3
+xptr dd x
+xptr2 dq x
+;dataptr dd offset _DATA
+;dataptr2 dq offset _DATA
+;codeptr dd offset _TEXT
+;codeptr2 dq offset _TEXT
+
+_DATA ENDS
+_BSS SEGMENT
+x dq ?
+y dq ?
+
+_BSS ENDS
+_TEXT SEGMENT
+x86ident:
+ ; extern with :proc
+ mov ebx,[foobar]
+ mov rcx,offset foobar
+ lea rdx, foobar
+ mov rax, qword ptr foobar[rcx]
+ mov rax, foobar
+ mov rbx, foobar
+ movzx rax, byte ptr foobar
+ movzx rax, byte ptr foobar[rax]
+
+ ; local proc
+ mov ebx,[trap]
+ mov rcx,offset trap
+ ; See note in YASM file
+ lea rdx, trap
+ mov rax, qword ptr trap[rcx]
+ mov rax, trap
+ mov rbx, trap
+ ; See note in YASM file
+ movzx rax, byte ptr trap
+ movzx rax, byte ptr trap[rax]
+
+ ; with :abs
+ ;mov ebx,[foobar2]
+ ;mov rcx,offset foobar2
+ ;lea rdx, foobar2
+ ;mov rax, qword ptr foobar2[rcx]
+ ;mov rax, foobar2
+ ;mov rbx, foobar2
+ ;movzx rax, byte ptr foobar2
+ ;movzx rax, byte ptr foobar2[rax]
+
+ ; with :qword
+ mov ebx, offset foobar3
+ mov ebx, dword ptr [foobar3]
+ mov rcx,offset foobar3
+ lea rdx, foobar3
+ mov rax, qword ptr foobar3[rcx]
+ mov rax, foobar3
+ mov rbx, foobar3
+ movzx rax, byte ptr foobar3
+ movzx rax, byte ptr foobar3[rax]
+
+ ; local var (dword)
+ mov ebx, offset __savident
+ mov ebx,[__savident]
+ mov rcx,offset __savident
+ lea rdx, __savident
+ mov rax, qword ptr __savident[rcx]
+ mov rax, qword ptr __savident
+ mov rbx, qword ptr __savident
+ movzx rax, byte ptr __savident
+ movzx rax, byte ptr __savident[rax]
+
+ ; local var (qword)
+ mov ebx, offset savidentptr2
+ mov ebx, dword ptr [savidentptr2]
+ mov rcx,offset savidentptr2
+ lea rdx, savidentptr2
+ mov rax, savidentptr2[rcx]
+ mov rax, savidentptr2
+ mov rbx, savidentptr2
+ movzx rax, byte ptr savidentptr2
+ movzx rax, byte ptr savidentptr2[rax]
+
+ ; bss local var (qword)
+ mov ebx, offset y
+ mov ebx, dword ptr [y]
+ mov rcx,offset y
+ lea rdx, y
+ mov rax, y[rcx]
+ mov rax, y
+ mov rbx, y
+ movzx rax, byte ptr y
+ movzx rax, byte ptr y[rax]
+
+ call foobar
+
+ call trap
+
+ ret
+
+trap proc public frame
+ sub rsp, 256
+ .allocstack 256
+ .endprolog
+ int 3
+ add rsp, 256
+trap endp
+
+_TEXT ENDS
+
+_FOO SEGMENT
+foo_foobar3ptr dd foobar3
+foo_foobar3ptr2 dq foobar3
+ mov ebx, dword ptr [foobar3]
+ mov rcx,offset foobar3
+ lea rdx, foobar3
+ mov rax, qword ptr foobar3[rcx]
+ mov rax, foobar3
+ mov rbx, foobar3
+ movzx rax, byte ptr foobar3
+ movzx rax, byte ptr foobar3[rax]
+_FOO ENDS
+END
diff --git a/modules/objfmts/win64/tests/win64-dataref2.asm b/modules/objfmts/win64/tests/win64-dataref2.asm
new file mode 100644
index 0000000..75bb4d0
--- /dev/null
+++ b/modules/objfmts/win64/tests/win64-dataref2.asm
@@ -0,0 +1,17 @@
+bits 64
+
+section .text
+
+bar:
+
+mov eax, [foo wrt rip]
+shl dword [foo wrt rip], 5
+cmp dword [foo wrt rip], 16
+cmp word [foo wrt rip], 10000
+cmp dword [foo wrt rip], 10000000
+je bar
+
+section .data
+
+foo:
+dd 5
diff --git a/modules/objfmts/win64/tests/win64-dataref2.hex b/modules/objfmts/win64/tests/win64-dataref2.hex
new file mode 100644
index 0000000..1b7a430
--- /dev/null
+++ b/modules/objfmts/win64/tests/win64-dataref2.hex
@@ -0,0 +1,343 @@
+64
+86
+02
+00
+00
+00
+00
+00
+c3
+00
+00
+00
+08
+00
+00
+00
+00
+00
+04
+00
+2e
+74
+65
+78
+74
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+29
+00
+00
+00
+64
+00
+00
+00
+8d
+00
+00
+00
+00
+00
+00
+00
+05
+00
+00
+00
+20
+00
+50
+60
+2e
+64
+61
+74
+61
+00
+00
+00
+29
+00
+00
+00
+00
+00
+00
+00
+04
+00
+00
+00
+bf
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+40
+00
+50
+c0
+8b
+05
+00
+00
+00
+00
+c1
+25
+00
+00
+00
+00
+05
+83
+3d
+00
+00
+00
+00
+10
+66
+81
+3d
+00
+00
+00
+00
+10
+27
+81
+3d
+00
+00
+00
+00
+80
+96
+98
+00
+74
+d7
+02
+00
+00
+00
+05
+00
+00
+00
+04
+00
+08
+00
+00
+00
+05
+00
+00
+00
+05
+00
+0f
+00
+00
+00
+05
+00
+00
+00
+05
+00
+17
+00
+00
+00
+05
+00
+00
+00
+06
+00
+1f
+00
+00
+00
+05
+00
+00
+00
+08
+00
+05
+00
+00
+00
+2e
+66
+69
+6c
+65
+00
+00
+00
+00
+00
+00
+00
+fe
+ff
+00
+00
+67
+01
+2d
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+2e
+74
+65
+78
+74
+00
+00
+00
+00
+00
+00
+00
+01
+00
+00
+00
+03
+01
+29
+00
+00
+00
+05
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+62
+61
+72
+00
+00
+00
+00
+00
+00
+00
+00
+00
+01
+00
+00
+00
+03
+00
+66
+6f
+6f
+00
+00
+00
+00
+00
+00
+00
+00
+00
+02
+00
+00
+00
+03
+00
+2e
+64
+61
+74
+61
+00
+00
+00
+00
+00
+00
+00
+02
+00
+00
+00
+03
+01
+04
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+04
+00
+00
+00
diff --git a/modules/objfmts/win64/tests/win64-dataref2.masm b/modules/objfmts/win64/tests/win64-dataref2.masm
new file mode 100644
index 0000000..827db3e
--- /dev/null
+++ b/modules/objfmts/win64/tests/win64-dataref2.masm
@@ -0,0 +1,17 @@
+
+_DATA SEGMENT
+foo dd 0
+
+_DATA ENDS
+_TEXT SEGMENT
+bar:
+mov eax, foo
+shl foo, 5
+cmp foo, 16
+cmp word ptr foo, 10000
+cmp foo, 10000000
+je bar
+
+_TEXT ENDS
+
+END
diff --git a/modules/objfmts/win64/tests/win64_test.sh b/modules/objfmts/win64/tests/win64_test.sh
new file mode 100755
index 0000000..4616900
--- /dev/null
+++ b/modules/objfmts/win64/tests/win64_test.sh
@@ -0,0 +1,3 @@
+#! /bin/sh
+${srcdir}/out_test.sh win64_test modules/objfmts/win64/tests "win64 objfmt" "-f win64" ".obj"
+exit $?