C-一个最“小”程序的疑惑
在看<<程序员自我修养>>第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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
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