1BITS 64 2 3global x86ident 4global __savident 5extern foobar ; :proc 6extern foobar2 ; :abs 7extern foobar3 ; :qword 8extern foobar4 ; :byte 9 10[SECTION .data] 11__savident dd 0 12savidentptr dd __savident 13savidentptr2 dq __savident 14x86identptr dd x86ident 15x86identptr2 dq x86ident 16foobarptr dd foobar 17foobarptr2 dq foobar 18foobar2ptr dd foobar2 19foobar2ptr2 dq foobar2 20foobar3ptr dd foobar3 21foobar3ptr2 dq foobar3 22xptr dd x 23xptr2 dq x 24 25[SECTION .bss] 26x resq 1 27y resq 1 28 29[SECTION .text] 30x86ident: 31 ; extern with :proc 32 ; This instruction generates a different relocation than 33 ; MASM does at present. 34 mov ebx, foobar ; WTF ML64.. this had [] 35 mov rcx, qword foobar 36 lea rdx, [foobar wrt rip] 37 mov rax, [foobar+rcx] 38 mov rax, qword foobar 39 mov rbx, qword foobar 40 movzx rax, byte [foobar wrt rip] 41 movzx rax, byte [foobar+rax] 42 43 ; local "proc" 44 ; See note above 45 mov ebx, trap 46 mov rcx, qword trap 47 ; MASM generates a REL32 reloc for this even though it's in 48 ; the same section. I don't know why, as the call instruction 49 ; below doesn't cause a reloc, so the linker can't be moving 50 ; functions around within an object! 51 lea rdx, [trap wrt rip] 52 mov rax, [trap+rcx] 53 mov rax, qword trap 54 mov rbx, qword trap 55 ; MASM generates a REL32 reloc for this even though it's in 56 ; the same section. I don't know why, as the call instruction 57 ; below doesn't cause a reloc, so the linker can't be moving 58 ; functions around within an object! 59 movzx rax, byte [trap wrt rip] 60 movzx rax, byte [trap+rax] 61 62 ; with :abs 63 ;mov ebx,[foobar2] 64 ;mov rcx,offset foobar2 65 ;lea rdx, foobar2 66 ;mov rax, qword ptr foobar2[rcx] 67 ;mov rax, foobar2 68 ;mov rbx, foobar2 69 ;movzx rax, byte ptr foobar2 70 ;movzx rax, byte ptr foobar2[rax] 71 72 ; with :qword 73 ; See note above 74 mov ebx, foobar3 75 mov ebx, [foobar3 wrt rip] 76 mov rcx, qword foobar3 77 lea rdx, [foobar3 wrt rip] 78 mov rax, [foobar3+rcx] 79 mov rax, [foobar3 wrt rip] 80 mov rbx, [foobar3 wrt rip] 81 movzx rax, byte [foobar3 wrt rip] 82 movzx rax, byte [foobar3+rax] 83 84 ; local var (dword) 85 ; See note above 86 mov ebx, __savident 87 mov ebx,[__savident wrt rip] 88 mov rcx, qword __savident 89 lea rdx, [__savident wrt rip] 90 mov rax, [__savident+rcx] 91 mov rax, [__savident wrt rip] 92 mov rbx, [__savident wrt rip] 93 movzx rax, byte [__savident wrt rip] 94 movzx rax, byte [__savident+rax] 95 96 ; local var (qword) 97 ; See note above 98 mov ebx, savidentptr2 99 mov ebx, [savidentptr2 wrt rip] 100 mov rcx, qword savidentptr2 101 lea rdx, [savidentptr2 wrt rip] 102 mov rax, [savidentptr2+rcx] 103 mov rax, [savidentptr2 wrt rip] 104 mov rbx, [savidentptr2 wrt rip] 105 movzx rax, byte [savidentptr2 wrt rip] 106 movzx rax, byte [savidentptr2+rax] 107 108 ; bss local var (qword) 109 ; See note above 110 mov ebx, y 111 mov ebx, [y wrt rip] 112 mov rcx, qword y 113 lea rdx, [y wrt rip] 114 mov rax, [y+rcx] 115 mov rax, [y wrt rip] 116 mov rbx, [y wrt rip] 117 movzx rax, byte [y wrt rip] 118 movzx rax, byte [y+rax] 119 120 call foobar 121 122 call trap 123 124 ret 125 126trap: sub rsp, 256 127 int3 128 add rsp, 256 129.end 130 131[SECTION .pdata] 132dd trap 133dd trap.end wrt trap 134dd $$xdatasym 135 136[SECTION .xdata] 137$$xdatasym: 138db 1, 7, 2, 0, 7, 1, 0x20, 0 139 140[SECTION _FOO] 141foo_foobar3ptr dd foobar3 142foo_foobar3ptr2 dq foobar3 143 mov ebx, [foobar3 wrt rip] 144 mov rcx, qword foobar3 145 lea rdx, [foobar3 wrt rip] 146 mov rax, [foobar3+rcx] 147 mov rax, [foobar3 wrt rip] 148 mov rbx, [foobar3 wrt rip] 149 movzx rax, byte [foobar3 wrt rip] 150 movzx rax, byte [foobar3+rax] 151 152