blob: d863dc5acee007c132e3c2c51dc2a048af613456 [file] [log] [blame]
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]