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]