Chinaunix首页 | 论坛 | 博客
  • 博客访问: 153349
  • 博文数量: 34
  • 博客积分: 2000
  • 博客等级: 大尉
  • 技术积分: 410
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-03 09:44
文章分类

全部博文(34)

文章存档

2011年(1)

2008年(33)

我的朋友

分类: LINUX

2008-05-29 09:15:37

在linux内核switch_to中:

21                      "movl $1f,%1\n\t"          /* save EIP */          \
22                      "pushl %6\n\t"             /* restore EIP */       \
23                      "jmp __switch_to\n"                                \
24                      "1:\t"                                             \
25                      "popl %%ebp\n\t"                                   \
26                      "popfl"                                            \

起到将进程再一次调用时的入口存到EIP中,即进程再一次运行会在此处继续。这里的$1f书上解释为24行1:的地址,很让人费解。其实这是这只是at&t一种语法:

局部标号可以用数字,而且可以重复。在以这些标号为目的的转移指令上,标号要带上后缀,b表示向前,f表示向后。
例:
 orw %bx,%bx
 jz 1f
1:
 movl $0x101000,%eax
 movl %eax,%cr3  /* set the page table pointer.. */
 movl %cr0,%eax
 orl $0x80000000,%eax
 movl %eax,%cr0  /* ..and set paging (PG) bit */
 jmp 1f    /* flush the prefetch-queue */
1:
 movl $1f,%eax
 jmp *%eax   /* make sure eip is relocated */
1:

绝对跳转/调用指令中的内存操作数必须以'*'为前缀,否则gas总是认为是相对跳转/调用指令,而且gas汇编程序自动对跳转指令进行优化,总是使用尽可能小的跳转偏移量。如果8比特的偏移量无法满足要求的话,as会使用一个32位的偏移量,as汇编程序暂时还不支持16位的跳转偏移量,所以对跳转指令使用'addr16'前缀是无效的。还有一些跳转指令只支持8位的跳转偏移量,这些指令是:


 

'jcxz','jecxz','loop','loopz','loope','loopnz''loopne'


 

如果你在汇编中使用了这些指令,用gas的汇编可能会出错,因为gcc在编译过程中不产生这些指令,所以在c语言中不必担心这些问题。
阅读(3676) | 评论(0) | 转发(0) |
0

上一篇:linux进程上下文

下一篇:X86寄存器简述

给主人留下些什么吧!~~