成为正常(近直系亲属)call
到您编写的 NASM 或 AT&T 语法中的绝对地址call 0x1234567
,汇编器+链接器负责计算arel32
从链接器放置的任何地方到达该目标call
操作说明。
例如在 Linux 上将其组装成静态 64 位 ELF 可执行文件yasm -felf64 foo.asm && ld foo.o -o foo
,然后用objdump -drwC -Mintel foo
给你:
foo: file format elf64-x86-64
Disassembly of section .text:
0000000000400080 <_start>:
400080: e8 e2 44 e3 00 call 1234567 <_end+0xc344df>
链接器计算出正确的rel32以达到0x1234567
from 0x400080+5
,基于R_X86_64_PC32
目标文件中的重定位:
0: e8 00 00 00 00 call 5 <_start+0x5> 1: R_X86_64_PC32 *ABS*+0x1234563
如何让 MASM 和/或 MSVC inline-asm 做到这一点?
MSVC 不接受_asm { call 1234567h; }
。错误是C2415: improper operand type
. 我找到的唯一答案 https://stackoverflow.com/questions/3933143/immediate-call-jmp-in-visual-c-inline-assembler建议使用内存或寄存器中的地址进行间接跳转的解决方法,但由于工具难以使用而导致机器代码效率低下并不是一个很好的解决方案。
我根本没有 MASM,所以我只能尝试 MSVC inline-asm (这不是同一件事)在 Godbolt 编译器资源管理器上 https://gcc.godbolt.org/#g:!((g:!((g:!((h:codeEditor,i:(j:1,lang:c%2B%2B,source:'void+foo()+%7B%0A+++//__asm+__emit++0xe8%0A+++//__asm+__emit++(0x00405B90+-+%24)%0A%0A+++_asm+%0A+++%7B%0A++++++call+0x00405B90%0A+++%7D%0A%7D'),l:'5',n:'0',o:'C%2B%2B+source+%231',t:'0')),header:(),k:49.534686971235196,l:'4',m:100,n:'0',o:'',s:0,t:'0'),(g:!((g:!((h:compiler,i:(compiler:cl19_32,filters:(b:'0',binary:'0',commentOnly:'0',demangle:'0',directives:'0',execute:'1',intel:'0',trim:'1'),lang:c%2B%2B,libs:!(),options:'-Ox',source:1),l:'5',n:'0',o:'x86+MSVC+19+2017+RTW+(Editor+%231,+Compiler+%234)+C%2B%2B',t:'0')),k:50.465313028764804,l:'4',m:50,n:'0',o:'',s:0,t:'0'),(g:!((h:output,i:(compiler:4,editor:1,wrap:'1'),l:'5',n:'0',o:'%234+with+x86+MSVC+19+2017+RTW',t:'0')),header:(),l:'4',m:50,n:'0',o:'',s:0,t:'0')),k:50.465313028764804,l:'3',n:'0',o:'',t:'0')),l:'2',n:'0',o:'',t:'0')),version:4.
您可以设置标签的地址并将其用作目标call symbol
?就像气体一样.set symbol, 0x1234567
它可以让你给一个符号一个地址without必须实际写作symbol:
任何地方。
你可以直接发出编码吗db 0E8h
/ dd 1234567h - ($ + 4)
?可能不会,在 NASM 中,仅适用于label - $ https://stackoverflow.com/questions/47494744/how-does-work-in-nasm-exactly, not absolute - label
我对答案最感兴趣,因此我可以将其包含在有关 jmp/call 绝对地址的规范答案中:在x86机器代码中调用绝对指针 https://stackoverflow.com/questions/19552158/call-an-absolute-pointer-in-x86-machine-code绝对不适合我想要实际使用的任何代码。