赞
踩
在64位系统下,系统调用可以直接通过
syscall
汇编指令实现,参数依次放入rax
、rsi
、rdi
、rdx
、r10
、r8
、r9
,返回值放入rax
,因此通过改变这些寄存器的值即可方便地进行系统调用。
在Linux中,打印字符串对应的系统调用号为0x1
,其原型为ssize_t write (int fd, const void * buf, size_t count);
我们把字符串打印到控制台,即stdout
,其fd
为1。具体代码如下
// ssize_t write (int fd @rax=1, const void * buf@rsi=a, size_t count@rdx=15);
int main() {
char* a = "1024快乐!";
long long n;
asm volatile (
"syscall\t\n"
: "=a" (n)
: "a" (1), "S" (a), "D" (1), "d" (15));
return 0;
}
在MacOS
下,除write
系统调用号与Linux
不同外1,其余参数均相同。
int main() {
char* a = "1024快乐!";
long long n;
asm volatile (
"syscall\t\n"
: "=a" (n)
: "a" (0x2000004), "S" (a), "D" (1), "d" (15));
return 0;
}
最后,祝大家
1024
程序员节快乐~
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。