自学内容网 自学内容网

2412d,d语言中写汇编

原文
嗨,我只是想共享该要点,它展示了如何在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时,objdumpeax显示它,不知道为什么!

顺便:MacOS上的syscall编号显然不稳定,通过C的stdlib调用内核,才是"正确"方式.

这很酷,因为我在D中找不到太多汇编的信息,这或许对别人有用.


原文地址:https://blog.csdn.net/fqbqrr/article/details/144781715

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!