|
发表于 2003-6-23 21:28:46
|
显示全部楼层
数字是和输入输出部的参数是对应的
从输出部到输入部的所有变量都算在内,从输出部的第一个变量开始算起,对应0,1,........
数字加上一个%,就是指变量
如果加上两个%,就是指变量的值
这和at&t汇编中%eax就是eax寄存器,如果是%%eax就是eax寄存器中的值一样.
比如:"=m" (v->counter)
:"ir" (i), "m" (v->counter)
第一行是输出部,第二行是输入部.
%0对应"=m" 后面的v->counter变量
%1 对应 (i)中的i变量
%2 对应 "m"后面的v->counter变量
=======================================================
那些d0,d1和d2是局部变量,这个目的你应该可以看懂
27页中
:"=&c" (d0), "=&D" (d1), "=&S" (d2)
:"0" (n/4), "q" (n), "1" ((long) to) , "2" ((long) from)
输出部有3个约束,对应操作数%0至%2,其中变量d0为操作数%0,必须放在寄存器ecx中,同样d1即%1必须放在edi中,d2即%2必须放在esi中。
输入部,有4个约束,对应操作数%3至%6,"0" (n/4)中的0表示%3(即n/4)和%0(即d0)要使用同一个寄存器,所以也必须是寄存器ecx。
同理,%5和%6,即参数to和from,分别与%1和%2使用相同的寄存器,所以必须是寄存器edi和esi。
这些局部变量就是用来暂存数值用的.
我想很多东西已经在书上说的比较明白,请仔细看书,认真琢磨.
你可以继续进行源代码的阅读,毕竟汇编语言不太多,只有几百行的汇编语句.不过如果你学习过汇编,你就会对这些东西有更深刻的理解,才能真正透彻理解底层的东西,比如在了解系统调用原理的时候,就应该对如何压栈的过程透彻理解,而这个需要你对汇编语言有一定的了解.
加油,这点困难不应该阻止你的阅读,坚持下去,但是基础知识是必不可少的.
|
|