- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
此代码适用于我的本科操作系统类(class)。我试图在 new_sp 的同一个堆栈上调用一个函数,然后返回到 new_sp 正在做的任何事情。它不起作用,我什至不确定如何调试它。建议或解决方案会很棒。我试图通过,如果我遗漏了什么,请告诉我。
注意:它是我们用于该类的特殊操作系统 (xinu) 的一部分。
该函数是从 c 代码中调用的。
我使用的引用文献:http://www.unixwiz.net/techtips/win32-callconv-asm.html
这部分代码用于在进程被切换之前将进程保存到堆栈中。 new_sp 指向的堆栈也以这种方式保存。
.text
.globl callsw
/*---------------------------------------------------------------------
* callsw - call is callsw(&old_sp, &new_sp, &call_back)
*---------------------------------------------------------------------*/
callsw:
/*keep all of the old contex switch instructions so it will work with
with cxtsw*/
pushl %ebp /* push ebp onto stack */
movl %esp,%ebp /* record current SP in ebp */
pushfl /* record flags */
pushal /* save general regs on stack */
/* save old segment registers here, if multiple allowed */
movl 8(%ebp),%eax /* Get mem location in which to */
/* save the old process's SP */
movl %esp,(%eax) /* save old process's SP */
movl 12(%ebp),%eax /* Get location from which to */
/* Switch to a new stach instead */
movl (%eax),%esp /* pick up new process's SP */
/* restore new seg. registers here, if multiple allowed */
popal /* restore general registers */
movl (%ebp),%eax /*keep old ebp for acess to arg 3*/
movl 4(%esp),%ebp /* pick up ebp before restoring */
/* interrupts */
popfl /* restore interrupt mask */
add $4,%esp /* skip saved value of ebp */
/* Switch to a new call back instead */
movl (%eax),%esp /* pick up new process's SP */
/* restore new seg. registers here, if multiple allowed */
popal /* restore general registers */
movl (%ebp),%eax /*keep old ebp for acess to arg 3*/
movl 4(%esp),%ebp /* pick up ebp before restoring */
/* interrupts */
popfl /* restore interrupt mask */
add $4,%esp /* skip saved value of ebp */
pop %ebx /* save the ra*/
movl %esp,%ebp /* move the base pointer to the bottom of the stack */
add -18,%ebp /* move stack down*/
/*set up stack and jump */
movl %ebp,%esp /* nothing on stack they are = */
movl %ebx, 0(%ebp) /* save ebp to stack */
movl %ebx, 4(%ebp) /* save ra */
movl 16(%eax),%ecx
JMP (%ecx) /* jump to call_back */
最佳答案
我认为你的问题在这里:
popal /* restore general registers */
movl (%ebp),%eax /*keep old ebp for acess to arg 3*/
popal
从保存在您要切换到的堆栈上的寄存器中恢复所有寄存器(包括 ebp)。所以
movl (%ebp),%eax
从新堆栈中加载一个值(实际上是
%ebp
的值,属于
callsw
的调用者。所以当你以后做
movl (%eax),%esp /* pick up new process's SP */
关于来自程序集(x86)和进程切换的 C 回调函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15893094/
C语言sscanf()函数:从字符串中读取指定格式的数据 头文件: ?
最近,我有一个关于工作预评估的问题,即使查询了每个功能的工作原理,我也不知道如何解决。这是一个伪代码。 下面是一个名为foo()的函数,该函数将被传递一个值并返回一个值。如果将以下值传递给foo函数,
CStr 函数 返回表达式,该表达式已被转换为 String 子类型的 Variant。 CStr(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CSng 函数 返回表达式,该表达式已被转换为 Single 子类型的 Variant。 CSng(expression) expression 参数是任意有效的表达式。 说明 通常,可
CreateObject 函数 创建并返回对 Automation 对象的引用。 CreateObject(servername.typename [, location]) 参数 serv
Cos 函数 返回某个角的余弦值。 Cos(number) number 参数可以是任何将某个角表示为弧度的有效数值表达式。 说明 Cos 函数取某个角并返回直角三角形两边的比值。此比值是
CLng 函数 返回表达式,此表达式已被转换为 Long 子类型的 Variant。 CLng(expression) expression 参数是任意有效的表达式。 说明 通常,您可以使
CInt 函数 返回表达式,此表达式已被转换为 Integer 子类型的 Variant。 CInt(expression) expression 参数是任意有效的表达式。 说明 通常,可
Chr 函数 返回与指定的 ANSI 字符代码相对应的字符。 Chr(charcode) charcode 参数是可以标识字符的数字。 说明 从 0 到 31 的数字表示标准的不可打印的
CDbl 函数 返回表达式,此表达式已被转换为 Double 子类型的 Variant。 CDbl(expression) expression 参数是任意有效的表达式。 说明 通常,您可
CDate 函数 返回表达式,此表达式已被转换为 Date 子类型的 Variant。 CDate(date) date 参数是任意有效的日期表达式。 说明 IsDate 函数用于判断 d
CCur 函数 返回表达式,此表达式已被转换为 Currency 子类型的 Variant。 CCur(expression) expression 参数是任意有效的表达式。 说明 通常,
CByte 函数 返回表达式,此表达式已被转换为 Byte 子类型的 Variant。 CByte(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CBool 函数 返回表达式,此表达式已转换为 Boolean 子类型的 Variant。 CBool(expression) expression 是任意有效的表达式。 说明 如果 ex
Atn 函数 返回数值的反正切值。 Atn(number) number 参数可以是任意有效的数值表达式。 说明 Atn 函数计算直角三角形两个边的比值 (number) 并返回对应角的弧
Asc 函数 返回与字符串的第一个字母对应的 ANSI 字符代码。 Asc(string) string 参数是任意有效的字符串表达式。如果 string 参数未包含字符,则将发生运行时错误。
Array 函数 返回包含数组的 Variant。 Array(arglist) arglist 参数是赋给包含在 Variant 中的数组元素的值的列表(用逗号分隔)。如果没有指定此参数,则
Abs 函数 返回数字的绝对值。 Abs(number) number 参数可以是任意有效的数值表达式。如果 number 包含 Null,则返回 Null;如果是未初始化变量,则返回 0。
FormatPercent 函数 返回表达式,此表达式已被格式化为尾随有 % 符号的百分比(乘以 100 )。 FormatPercent(expression[,NumDigitsAfterD
FormatNumber 函数 返回表达式,此表达式已被格式化为数值。 FormatNumber( expression [,NumDigitsAfterDecimal [,Inc
我是一名优秀的程序员,十分优秀!