C-一个最“小”程序的疑惑

发布于 2016-10-19 10:25:57 字数 539 浏览 1226 评论 1

在看<<程序员自我修养>>第4.6小结时,看到这样一个最“小”程序:

char* str = "Hello Worldn";

void print()
{
asm("movl $13, %%edxnt"
"movl %0, %%ecxnt"
"movl $0, %%ebxnt"
"movl $4, %%eaxnt"
"int $0x80"
::"r"(str):"edx","ecx","ebx");
}

void exit()
{
asm("movl $17, %ebxnt"
"movl $1, %eaxnt"
"int $0x80nt");
}

void nomain()
{
print();
exit();
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

浮生未歇 2017-03-13 13:00:15

C内嵌汇编的格式为

__asm__ __volatile__("Instruction List" : Output : Input : Clobber/Modify);
"r"(str) 为Input,对应Instruction List中的%0

可参考http://www.embedu.org/Column/Column28.htm

系统调用通过0x80中断实现。其中eax为调用号,ebx,ecx,edx等通用寄存器来传递参数。
比如WRITE调用是往一个文件句柄写入数据,如果用C语言来描述它的原型就是:
int write(int filedesc, char *buffer, int size);

print函数中倒着看就是:
·WRITE调用的调用号为4, 则eax = 4

·filedesc表示被写入的文件句柄,使用ebx寄存器传递,我们这里是要往标准输出,它的文件句柄为0,即ebx = 0

·buffer表示要写入的缓冲区地址,使用ecx寄存器传递,我们这要输出字符串str,所以ecx = str.

·size表示要写入的字节数,使用edx寄存器传递,字符串“Hello world!n”长度为13字节,所以edx = 13

来自http://www.cnblogs.com/zhuyp1015/archive/2012/05/02/2479546.html

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文