当前位置: 技术问答>linux和unix
printk的意思?
来源: 互联网 发布时间:2016-02-11
本文导语: 底下的組合語言代表著什麼意思呢? 是否有人能詳細說明thx static char buf[1024]; int printk(const char *fmt, ...) { va_list args; int i; va_start(args, fmt); i=vsprintf(buf,fmt,args); va_end(args); __asm__("push %%fsnt" "push %%dsnt" "pop %%...
底下的組合語言代表著什麼意思呢?
是否有人能詳細說明thx
static char buf[1024];
int printk(const char *fmt, ...)
{
va_list args;
int i;
va_start(args, fmt);
i=vsprintf(buf,fmt,args);
va_end(args);
__asm__("push %%fsnt"
"push %%dsnt"
"pop %%fsnt"
"pushl %0nt"
"pushl $_bufnt"
"pushl $0nt"
"call _tty_writent"
"addl $8,%%espnt"
"popl %0nt"
"pop %%fs"
::"r" (i):"ax","cx","dx");
return i;
}
是否有人能詳細說明thx
static char buf[1024];
int printk(const char *fmt, ...)
{
va_list args;
int i;
va_start(args, fmt);
i=vsprintf(buf,fmt,args);
va_end(args);
__asm__("push %%fsnt"
"push %%dsnt"
"pop %%fsnt"
"pushl %0nt"
"pushl $_bufnt"
"pushl $0nt"
"call _tty_writent"
"addl $8,%%espnt"
"popl %0nt"
"pop %%fs"
::"r" (i):"ax","cx","dx");
return i;
}
|
"push %%fsnt" #fs寄存器值入栈, (4字节32位)
"push %%dsnt" #ds寄存器值入栈,
"pop %%fsnt" #ds出栈保存到fs寄存器
"pushl %0nt" #%0对应第一个操作数, 即下面的"r"(i), 也就是i的值保存到一个寄存器中, 然后入栈.
#i的值是vsprintf的返回值, 也就是写到buf中的字节数.(参数, 4字节32位)
"pushl $_bufnt" #buf的地址入栈(参数, 4字节32位)
"pushl $0nt" #入栈一个空值(分隔?4字节32位)
"call _tty_writent" #调用写终端函数, 这个函数会按照栈内的数作为参数进行执行, 写到终端上.
"addl $8,%%espnt" #栈顶指针esp移动8字节, 移动到buf的前面, 相当于两次pop弹出空值和buf地址.
"popl %0nt" #恢复变量i.
"pop %%fs" #恢复fs寄存器值.
::"r" (i):"ax","cx","dx"); #输入参数i, "r"表示该变量要与寄存器关联, 另外ax cx dx 3个寄存器值在此过程中保持不变.
这里的空值意义我不明白.
"push %%dsnt" #ds寄存器值入栈,
"pop %%fsnt" #ds出栈保存到fs寄存器
"pushl %0nt" #%0对应第一个操作数, 即下面的"r"(i), 也就是i的值保存到一个寄存器中, 然后入栈.
#i的值是vsprintf的返回值, 也就是写到buf中的字节数.(参数, 4字节32位)
"pushl $_bufnt" #buf的地址入栈(参数, 4字节32位)
"pushl $0nt" #入栈一个空值(分隔?4字节32位)
"call _tty_writent" #调用写终端函数, 这个函数会按照栈内的数作为参数进行执行, 写到终端上.
"addl $8,%%espnt" #栈顶指针esp移动8字节, 移动到buf的前面, 相当于两次pop弹出空值和buf地址.
"popl %0nt" #恢复变量i.
"pop %%fs" #恢复fs寄存器值.
::"r" (i):"ax","cx","dx"); #输入参数i, "r"表示该变量要与寄存器关联, 另外ax cx dx 3个寄存器值在此过程中保持不变.
这里的空值意义我不明白.
|
楼上的赞一个
va_start(args, fmt);
i=vsprintf(buf,fmt,args);
va_end(args);
就表示把printk()里面要打印的字符串保存在buf中。
下面的汇编把buf传进寄存器中,call调用内核函数打印出来。
va_start(args, fmt);
i=vsprintf(buf,fmt,args);
va_end(args);
就表示把printk()里面要打印的字符串保存在buf中。
下面的汇编把buf传进寄存器中,call调用内核函数打印出来。
|
" "pushl $0nt" #入栈一个空值(分隔?4字节32位)"
应该就是作为 _tty_write的参数,需要看一下使用调用tty_write的实现,
我猜测这里应该值得是loff_t *ppos,也就是从buf的偏移几位开始打印输出
这里应该就是从buf的启示地址开始打印输出
应该就是作为 _tty_write的参数,需要看一下使用调用tty_write的实现,
我猜测这里应该值得是loff_t *ppos,也就是从buf的偏移几位开始打印输出
这里应该就是从buf的启示地址开始打印输出
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。