NASM仅包含标签之类的引用,而不包含代码

时间:2020-09-29 17:35:19

标签: assembly nasm

我试图在应用程序中包含操作系统的引用,但不包含代码,因为代码已在内存中。有没有办法只将引用(例如os_syscall_reboot ias位于0xda0e)包含在nasm中?

1 个答案:

答案 0 :(得分:0)

os_syscall_reboot equ 0xda0e定义一个汇编时间常数将以某种使用它的方式工作,在某些情况下包括call os_syscall_reboot

nasm -felf32一起使用,并与ld链接到静态ELF可执行文件:

os_syscall_reboot equ 0xda0e
call os_syscall_reboot
+ nasm -felf32 -Worphan-labels foo.asm
+ ld -melf_i386 -o foo foo.o
ld: warning: cannot find entry symbol _start; defaulting to 0000000008049000

foo:     file format elf32-i386


Disassembly of section .text:

08049000 <__bss_start-0x1000>:
 8049000:       e8 09 4a fc f7          call   da0e <os_syscall_reboot>

(我很惊讶os_syscall_reboot像符号名objdump -drwC -Mintel一样变成可执行文件。我只将其定义为带有equ的汇编时间常数,而不是org +标签或其他任何东西。)

但是使用nasm -felf64,它使用0xda0e-5作为rel32偏移而不是绝对目标进行了组装。(NASM版本2.14.02,在x86-64 Arch GNU上) / Linux)。即它跳到$ + 0xda0e,这真是太奇怪了。

...
  401000:       e8 0a da 00 00          call   40ea0f <__bss_start+0xca0f>

YASM -felf64会按预期组装。

  401000:       e8 09 ca c0 ff          call   da0e <__bss_start-0x3f45f2>