简单!!高分!!Linux0.01中的简单问题—关于switch_to(n)。

aprilsnow 2004-08-05 04:28:05

我在阅读Linux0.01代码时怎么也弄不懂这一段的用处:

/*
* switch_to(n) should switch tasks to task nr n, first
* checking that n isn't the current task, in which case it does nothing.
* This also clears the TS-flag if the task we switched to has used
* tha math co-processor latest.
*/
#define switch_to(n) {\
struct {long a,b;} __tmp; \
__asm__("cmpl %%ecx,_current\n\t" \
"je 1f\n\t" \
"xchgl %%ecx,_current\n\t" \
"movw %%dx,%1\n\t" \
"ljmp %0\n\t" \
"cmpl %%ecx,%2\n\t" \
"jne 1f\n\t" \
"clts\n" \
"1:" \
::"m" (*&__tmp.a),"m" (*&__tmp.b), \
"m" (last_task_used_math),"d" _TSS(n),"c" ((long) task[n])); \
}


AT&T汇编实在太难懂了,请问各位这一段做了什么啊?
明明输入参数有5个,为什么只能在代码中找到%0、%1、%2这三个东东啊?
这个问题把我郁闷死了,求大家帮忙!不胜感激!!
...全文
132 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
YaST 2004-08-10
  • 打赏
  • 举报
回复
gz
loveisbug 2004-08-09
  • 打赏
  • 举报
回复
第一个冒号后的限定字符串用于描述指令中的“输出”操作数。刮号中的操作数与C语言的变量联系起来。第二个冒号后的限定字符串用于描述指令中的“输入”操作数。这个操作数可以是一个立即操作数或者是一个寄存器操作数。

搜一篇介绍AT&T汇编的语法看看。
aprilsnow 2004-08-05
  • 打赏
  • 举报
回复
如果可能的话,能否请哪位大虾转成 Intel ASM 看一下?
wxywh 2004-08-05
  • 打赏
  • 举报
回复
%0:指*&__tmp.a
%1:指*&__tmp.b
%2:指last_task_used_math
具体还是要看看AT&T汇编
aprilsnow 2004-08-05
  • 打赏
  • 举报
回复
怎么没人响应啊?在线等待,分不够可以再加呀。

4,441

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧