当前位置: 技术问答>linux和unix
菜鸟求教
来源: 互联网 发布时间:2016-02-19
本文导语: 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" //保存fs "push %%dsnt" "pop %%fsnt" //令fs=ds "pushl %0nt" 将字符串长度压入队栈 "pushl $_bu...
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" //保存fs
"push %%dsnt"
"pop %%fsnt" //令fs=ds
"pushl %0nt" 将字符串长度压入队栈
"pushl $_bufnt"//将buf的地址压入堆栈
"pushl $0nt" //将数值0压入堆栈。通道号channel
"call _tty_writent"
"addl $8,%%espnt"
"popl %0nt"
"pop %%fs"
::"r" (i):"ax","cx","dx");
return i;
}
其中的汇编代码,我看不太懂, 为什么汇编第三行表示fs=ds,通道号是什么东东?
还望高人指点,跪谢!
{
va_list args;
int i;
va_start(args, fmt);
i=vsprintf(buf,fmt,args);
va_end(args);
__asm__("push %%fsnt" //保存fs
"push %%dsnt"
"pop %%fsnt" //令fs=ds
"pushl %0nt" 将字符串长度压入队栈
"pushl $_bufnt"//将buf的地址压入堆栈
"pushl $0nt" //将数值0压入堆栈。通道号channel
"call _tty_writent"
"addl $8,%%espnt"
"popl %0nt"
"pop %%fs"
::"r" (i):"ax","cx","dx");
return i;
}
其中的汇编代码,我看不太懂, 为什么汇编第三行表示fs=ds,通道号是什么东东?
还望高人指点,跪谢!
|
还不是很明白, pop fs 弹出的是fs,怎么会把ds弹出 并给fs赋值呢
============================================================================
看来兄弟对汇编还不熟,pop fs是告诉编译器与CPU,在栈中弹出4个字节的数据并存入fs寄存器中,然后栈指针再移动4个字节,至于是不是将ds弹出并给fs赋值,就看你入栈的顺序了,入栈顺序与出栈顺序是要你自己保证的,编译器与CPU只负责移动栈指针,只负责将相应的多少字节的数据存入你所指示的寄存器中。。。
============================================================================
看来兄弟对汇编还不熟,pop fs是告诉编译器与CPU,在栈中弹出4个字节的数据并存入fs寄存器中,然后栈指针再移动4个字节,至于是不是将ds弹出并给fs赋值,就看你入栈的顺序了,入栈顺序与出栈顺序是要你自己保证的,编译器与CPU只负责移动栈指针,只负责将相应的多少字节的数据存入你所指示的寄存器中。。。