Chinaunix首页 | 论坛 | 博客
  • 博客访问: 264575
  • 博文数量: 52
  • 博客积分: 1379
  • 博客等级: 大尉
  • 技术积分: 525
  • 用 户 组: 普通用户
  • 注册时间: 2006-06-18 17:34
文章分类

全部博文(52)

文章存档

2011年(48)

2010年(4)

分类: C/C++

2011-03-01 15:43:00

  1. 操作码已经给出,剩下modrm操作数, 以下以0x89为例Opcode 0x89(mov为例)
  2. 参考
  3. <>


  4. /* generate a modrm reference. 'op_reg' contains the addtionnal 3
  5.    opcode bits */
  6. static void gen_modrm(int op_reg, int r, Sym *sym, int c)
  7. {
  8.    
    ModRM.reg
    [5:3]
     提供 register 或者对 Opcode 进行补充
  9.     op_reg = op_reg << 3;

  10.     if ((r & VT_VALMASK) == VT_CONST) {
  11.         /* constant memory reference */
  12.         o(0x05 | op_reg);
  13.         gen_addr32(r, sym, c);
  14.     } else if ((r & VT_VALMASK) == VT_LOCAL) {
  15.         把寄存器保存到栈上,具体位置由 c给出,loc全局变量用于保存当前栈空间的起始处
  16.         /* currently, we use only ebp as base */
  17.         if (c == (char)c) {
  18.             偏移量是否只有低7位, (c & 0x7f) == 0
  19.             /* short reference */
  20.             %epb + 8bit偏移
  21.             o(0x45 | op_reg);
  22.             g(c);
  23.         } else {
                %epb + 32bit偏移
  24.             oad(0x85 | op_reg, c);
  25.         }
  26.     } else {
  27.        
  28.         寄存器 -> (寄存器)
    00
     [base]
     提供 [base] 形式的 memory 寻址

  29.         g(0x00 | op_reg | (r & VT_VALMASK));
  30.     }
  31. }
阅读(1668) | 评论(0) | 转发(0) |
0

上一篇:tcc 一个预处理bug

下一篇:save_reg

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