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
时,objdump
按eax
显示它,不知道为什么!
顺便:MacOS
上的syscall
编号显然不稳定
,通过C的stdlib
调用内核,才是"正确"方式
.
这很酷,因为我在D中找不到太多汇编
的信息,这或许对别人有用
.
原文地址:https://blog.csdn.net/fqbqrr/article/details/144781715
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!