原文
 嗨,我只是想共享该要点,它展示了如何在ASM中用D编写你好.
 D中写汇编非常方便!这是我写的:
extern(C) int main()
{auto hip = "hello D\n".ptr;size_t len = 8;//`write(1,消息,长度)`asm {mov RDX, len;//缓冲长度mov RSI, hip;//消息缓冲mov EDI, 1;//`Stdout`文描符`(0x01)`mov RAX, 0x2000004;//写入系统调用编号(在`Linux`上为`0x01`)syscall;//`syscall`}return 0;
}
编译它:
dmd -betterC -ofhello hello.d
在MacOS(Intel)上出现以下结果:
  objdump d M intel ./main
./main:|file format macho 64bit x86-64第`__TEXT`,`__text`节的反汇编:
0000000100000fcc <_main>:
100000fcc: 55                          |push|rbp
100000fcd: 48 8b ec                    |mov|rbp, rsp
100000fd0: 48 83 ec 10                 |sub|rsp, 0x10
100000fd4: 48 8d 05 25 00 00 00        |lea|rax, [rip + 0x25]       ## 0x100001000
100000fdb: 48 89 45 f0                 |mov|qword ptr [rbp - 0x10], rax
100000fdf: 48 c7 45 f8 08 00 00 00     |mov|qword ptr [rbp - 0x8], 0x8
100000fe7: 48 8b 55 f8                 |mov|rdx, qword ptr [rbp - 0x8]
100000feb: 48 8b 75 f0                 |mov|rsi, qword ptr [rbp - 0x10]
100000fef: bf 01 00 00 00              |mov|edi, 0x1
100000ff4: b8 04 00 00 02              |mov|eax, 0x2000004
100000ff9: 0f 05                       |syscall
100000ffb: 31 c0                       |xor|eax, eax
100000ffd: c9                          |leave
100000ffe: c3                          |ret
当我把syscall编号写入RAX时,objdump按eax显示它,不知道为什么!
顺便:MacOS上的syscall编号显然不稳定,通过C的stdlib调用内核,才是"正确"方式.
这很酷,因为我在D中找不到太多汇编的信息,这或许对别人有用.