免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 13184 | 回复: 3
打印 上一主题 下一主题

ud2是什么指令? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-06-20 20:58 |只看该作者 |倒序浏览
#define BUG()                                \
__asm__ __volatile__(        "ud2\n"                \
                        "\t.word %c0\n"        \
                        "\t.long %c1\n"        \
                         : : "i" (__LINE__), "i" (__FILE__))


ud2是什么指令?机器码好像是0f 0b ?
BUG()能造成系统停机么?

%0、%1是占位符号,那么前面的修饰符'c'是什么含意?(%c0、%c1)
除了'c'还有哪些修饰符?在哪里可以查到这些修饰符的信息?

论坛徽章:
0
2 [报告]
发表于 2007-06-21 10:06 |只看该作者
undefined, 故意让CPU出错的 -- 记得是这样,FIXME

论坛徽章:
0
3 [报告]
发表于 2007-06-22 09:46 |只看该作者
albcamus 说得没错,

查了一下手册, UD2是一种让CPU产生invalid opcode exception的软件指令.  内核发现CPU出现这个异常, 会立即停止运行.

'c' 在gcc中, 叫做operand code, c只能用在常量变量(就是constraint是'i')和条件判断指令中. 作用是将这个常量值打印在指令中.
这段代码:

  1. #define BUG()                                                                \
  2.         do {                                                                \
  3.                 asm volatile("1:\tud2\n"                                \
  4.                              ".pushsection __bug_table,\"a\"\n"                \
  5.                              "2:\t.long 1b, %c0\n"                        \
  6.                              "\t.word %c1, 0\n"                                \
  7.                              "\t.org 2b+%c2\n"                                \
  8.                              ".popsection"                                \
  9.                              : : "i" (__FILE__), "i" (__LINE__),        \
  10.                              "i" (sizeof(struct bug_entry)));                \
  11.                 for(;;) ;                                                \
  12.         } while(0)
复制代码

编译后的代码为:

  1. .LC0:
  2.         .string "asm.c"
  3.         .text
  4. .....

  5. #APP
  6.         1:      ud2
  7. .pushsection __bug_table,"a"
  8. 2:      .long 1b, .LC0
  9.         .word 18, 0
  10.         .org 2b+4
  11. .popsection
  12. #NO_APP
复制代码

其实除了ud2这条指令, 其他都是assembler directives.

如果没有'c'这个operand code, 产生的指令是:

  1. .LC0:
  2.         .string "asm.c"
  3.         .text

  4. #APP
  5.         1:      ud2
  6. .pushsection __bug_table,"a"
  7. 2:      .long 1b, $.LC0
  8.         .word $18, 0
  9.         .org 2b+$4
  10. .popsection
  11. #NO_APP
复制代码

这段代码对于assembler directives(GAS的输入)来说, 可能是不能正常工作的.

i386的operand code可以在gcc源代码的gcc/config/i386.c中查询到, 我也是很久以前移植过一种CPU ARCH才记得有这么个东西.
   L,W,B,Q,S,T -- print the opcode suffix for specified size of operand.
   C -- print opcode suffix for set/cmov insn.
   c -- like C, but print reversed condition
   F,f -- likewise, but for floating-point.
   O -- if HAVE_AS_IX86_CMOV_SUN_SYNTAX, expand to "w.", "l." or "q.",
        otherwise nothing
   R -- print the prefix for register names.
   z -- print the opcode suffix for the size of the current operand.
   * -- print a star (in certain assembler syntax)
   A -- print an absolute memory reference.
   w -- print the operand as if it's a "word" (HImode) even if it isn't.
   s -- print a shift double count, followed by the assemblers argument
        delimiter.
   b -- print the QImode name of the register for the indicated operand.
        %b0 would print %al if operands[0] is reg 0.
   w --  likewise, print the HImode name of the register.
   k --  likewise, print the SImode name of the register.
   q --  likewise, print the DImode name of the register.
   h -- print the QImode name for a "high" register, either ah, bh, ch or dh.
   y -- print "st(0)" instead of "st" as a register.
   D -- print condition for SSE cmp instruction.
   P -- if PIC, print an @PLT suffix.
   X -- don't print any sort of PIC '@' suffix for a symbol.
   & -- print some in-use local-dynamic symbol name.


ps. 较新的内核代码都已经将BUG()的实现做了一些修改, 改成了我上面提到的那种, 这可以让出错的指令直接在栈顶, 便于调试.

论坛徽章:
20
程序设计版块每日发帖之星
日期:2015-08-17 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00每日论坛发贴之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:5615-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之青岛
日期:2017-09-04 17:32:0515-16赛季CBA联赛之吉林
日期:2018-03-26 10:02:16程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:512015亚冠之萨济拖拉机
日期:2015-08-17 12:21:08
4 [报告]
发表于 2015-12-04 10:13 |只看该作者
终于找到这个老帖子了。

https://gcc.gnu.org/onlinedocs/gcc-5.2.0/gcc/Extended-Asm.html
6.43.2.7 x86 Operand Modifiers
c  Require a constant operand and print the constant expression with no punctuation

void f1()
{
        asm("nop");
        asm (".word %0"::"i"(0xff));   => 生成0x00 0x00 => link error: undefined reference to `$255'
        asm("nop");
        asm (".word %c0"::"i"(0xff));  => 生成0xff 0x00
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP