当前位置:  开发笔记 > 编程语言 > 正文

Asm代码的说明

如何解决《Asm代码的说明》经验,为你挑选了1个好方法。

以下GCC内联asm取自LuaJit的coco库.有人可以逐行解释它的作用吗?

static inline void coco_switch(coco_ctx from, coco_ctx to)
{
  __asm__ __volatile__ (
    "movl $1f, (%0)\n\t" 
    "movl %%esp, 4(%0)\n\t" 
    "movl %%ebp, 8(%0)\n\t"
    "movl 8(%1), %%ebp\n\t" 
    "movl 4(%1), %%esp\n\t" 
    "jmp *(%1)\n" "1:\n"
    : "+S" (from), "+D" (to) : : "eax", "ebx", "ecx", "edx", "memory", "cc");
}

谢谢



1> DevSolar..:

我的ASM对细节有点模糊,但我想我可以给你一个大概的想法.

ESP:堆栈指针,EBP:基指针.

movl $1f, (%0)

将值0x1f移动到参数0(从).

movl %%esp, 4(%0)

将寄存器ESP的内容移动到(从+ 4开始).

movl %%ebp, 8(%0)

将寄存器EBP的内容移入(从+ 8开始).

movl 8(%1), %%ebp

将(到+ 8)的内容移动到寄存器EBP中.

movl 4(%1), %%esp

将(到+ 4)的内容移动到寄存器ESP中.

jmp *(%1)

跳转到(to)中包含的地址.

"1:"是跳转标签.

"+ S"声明"源"(读)参数,"+ D"表示目标(写入)参数.语句末尾的寄存器列表是"clobber"列表,可能由ASM代码修改的寄存器列表,因此编译器可以采取措施来保持一致性(即,不依赖于例如ECX仍然包含相同的值像之前一样).

我猜coco_ctx的意思是"coco context".因此:该函数将当前堆栈帧保存在"from"结构中,并将堆栈帧设置为"to"结构中保存的内容.基本上,它从当前函数跳转到另一个函数.


这是完全正确的.不过,它不仅仅是从一个函数跳转到另一个函数:它从一个完整的调用堆栈跳转到另一个函数; 它完全切换执行上下文.(另外,gosh但是GCC内联汇编语法很奇怪.)
它的AT&T语法(http://wiki.osdev.org/Opcode_syntax)包含在C函数调用语法中(http://wiki.osdev.org/Inline_Assembly).你不会相信它,但我实际上更喜欢它而不是"标准"英特尔语法.;-)
推荐阅读
oDavid_仔o_880
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有