Categories |
CPU¤ÎÁϤ꤫¤¿ |
Modern Compiler Implementation in ML |
NerdTV |
PDP-11¥·¥ß¥å¥ì¡¼¥¿¤Ç¸ÅÂå¤ÎUNIX¤òư¤«¤·¤Æ¤ß¤ë |
The Yakumo Project |
¤ä¤µ¤°¤ìÆÉ½ñÏ¿
ºÇ¶á¤Î¥Ä¥Ã¥³¥ß:1.Braritemeal(2008-08-25 00:41)
2.dyendignify(2008-08-18 10:20)
3.Dominic(2008-06-23 05:05)
ºÇ¶á¤Î¥È¥é¥Ã¥¯¥Ð¥Ã¥¯:1.Ç»½Ì´Ô¸µ¥ª¥ì¥ó¥¸¥Ë¥å¡¼¥¹:¥×¥í.. (2006-12-22 22:02)
¥Æ¥¹¥È¥×¥í¥°¥é¥à¤ò¼Â¹Ô¤·¤Æ·ë²Ì¤ò³Îǧ¤·¤è¤¦¤È»×¤¦¤È¡¢Ê¸»úÎó¤À¤±¤Ç¤Ê¤¯¿ôÃͤâɽ¼¨¤µ¤»¤¿¤¯¤Ê¤ë¡£¤À¤¬
Tiger
¤Ë¤Ï¿ôÃÍɽ¼¨ÍѤÎÁȤ߹þ¤ß´Ø¿ô¤¬¤Ê¤¤¤Î¤Ç¡¢¥Þ¡¼¥¸¥½¡¼¥È¤Î¥µ¥ó¥×¥ë¥×¥í¥°¥é¥à¤«¤é°Ê²¼¤Î¤è¤¦¤Ê´Ø¿ô¤ò°ú¤ÃÄ¥¤Ã¤Æ¤¤Æ»È¤¦¤³¤È¤Ë¤·¤¿¡£
function printint(i: int) =
let function f(i:int) = if i>0
then (f(i/10); print(chr(i-i/10*10+ord("0"))))
in if i<0 then (print("-"); f(-i))
else if i>0 then f(i)
else print("0")
end
³Ý ¤±»»¤È³ä¤ê»»¡¢ifʸ¡¢¥Í ¥¹¥È¤·¤¿´Ø¿ôÄêµÁ¤Ë¡¢¤È¤É¤á¤ÏºÆµ¢¸Æ¤Ó½Ð¤·¤È¡¢"Hello World"¤Î¼¡¤Ë»î¤¹¥×¥í¥°¥é¥à¤È¤·¤Æ¤ÏÊ£»¨¡¦ÌµËŤ¤ï¤Þ¤ê¤Ê¤¤…¤È¤¤¤¦¤«¡¢¤³¤Î¸å¤Ëºî¤ëͽÄê¤Î¡ÊÎ㤨¤Ð²Ã¸º¾è½ü¤È¤¤¤Ã¤¿¡Ëñ½ã ¤Ê¥Æ¥¹¥È¥×¥í¥°¥é¥à¤Î¼Â¹Ô·ë²Ì¤ò³Îǧ¤¹¤ë¤¿¤á¤Ë¤³¤ó¤Ê¤â¤Î¤òÍѰդ¹¤ë¤È¤³¤í¤«¤é¤·¤Æ¡¢¼êÃʤÈÌÜŪ¤¬¤Ò¤Ã¤¯¤êÊ֤äƤ¤¤ë¤Î¤À¤¬¡¢¤½¤³¤Ïµ¤¤Ë¤·¤Ê¤¤¤³¤È¤Ë¤¹ ¤ë¡£
…°Æ¤ÎÄê¥Ï¥Þ¤Ã¤¿¡£Íî¤È¤··ê¤Ï¤¤¤¯¤Ä¤«¤¢¤Ã¤¿¤Î¤À¤¬¡¢ºÇ¸å¤Ë»Ä¤Ã¤¿¤Î¤¬¤³¤ì¡£
$ ./a.exe
Floating point exception (core dumped)
Éâ Æ°¾®¿ôÅÀ±é»»¤Ï»È¤Ã¤Æ¤¤¤Ê¤¤¡Ê¤È¤¤¤¦¤«¤³¤Î¥³¥ó¥Ñ¥¤¥é¤Ç¤ÏÉâÆ°¾®¿ôÅÀ¤Î·×»»¤Ï¤Ç¤¤Ê¤¤¡Ë¤Î¤Ë°ìÂβ¿¤¬µ¯¤¤Æ¤¤¤ë¤Î¤À¤í¤¦¤«¡£
printint()´Ø¿ô¤ÎÃæ¿È¤òºï¤Ã¤Æ¤¤¤Ã¤ÆÌäÂê¤ò¹Ê¤ê¹þ¤ó¤À·ë²Ì¡¢ºÇ¸å¤Ë»Ä¤Ã¤¿¤Î¤¬¡¢³ä¤ê»»¤Ç¤¢¤Ã¤¿¡£¾åµ¤Î¥¨¥é¡¼¤òºÆ¸½¤Ç¤¤ëºÇ¾®¤Î¥³¡¼¥É¤Ï¤³¤ó¤Ê´¶¤¸¤Ë¤Ê¤ë¡£
6 / 2
Åö ½é¡¢¤³¤Î¥³¥ó¥Ñ¥¤¥é¤Ï°Ê²¼¤Î¤è¤¦¤Ê¥¢¥»¥ó¥Ö¥ê¥³¡¼¥É¤ò½ÐÎϤ·¤Æ¤¤¤¿¡Ê¤Á¤Ê¤ß¤Ë¡¢GCC¤Ç¤³¤Î¤è¤¦¤ÊÄê¿ôƱ»Î¤Î·×»»¤ò¤µ¤»¤ë¤ÈºÇŬ²½¤Ë¤è¤ê¥¢¥»¥ó¥Ö¥ê¥³¡¼¥É ¥ì¥Ù¥ë¤Ç¤Î³ä¤ê»»¤Ï¼Â¹Ô¤µ¤ì¤º¡¢"6/2"¤Î·×»»·ë²Ì¤Ç¤¢¤ë"3"¤¬Ä¾Àܥ쥸¥¹¥¿¤ËÂåÆþ¤µ¤ì¤ë¤Î¤À¤¬¡¢¤³¤Î¥³¥ó¥Ñ¥¤¥é¤Ç¤Ï¤½¤Î¤è¤¦¤ÊºÇŬ²½¤Ï¤Þ¤À¼ÂÁõ¤µ¤ì ¤Æ¤¤¤Ê¤¤¡Ë
movl $6, %eax
movl $2, %ebx
idivl %ebx
¤È ¤³¤í¤¬¡¢¤³¤Î¥¢¥»¥ó¥Ö¥ê¥³¡¼¥É¤Ï¤¤Á¤ó¤Èưºî¤·¤Ê¤¤¡£
É乿ÉÕ¤À°¿ô¤Î³ä¤ê»»Ì¿Îá¤Ç¤¢¤ë"idivl"(IDIV) Ì¿Îá¤ò¼Â¹Ô¤¹¤ë¤È¤¤Ë¤Ï¡¢¤Þ¤º³ä¤é¤ì¤ë¿ô¤ò64¥Ó¥Ã¥È¤Çɽ¸½¤·¤¿¤â¤Î¤Î¤¦¤Á¡¢¤½¤Î¾å°Ì32¥Ó¥Ã¥È¤òEDX¥ì¥¸¥¹¥¿¤Ë¡¢²¼°Ì32¥Ó¥Ã¥È¤òEAX¥ì¥¸¥¹¥¿¤ËÃÖ ¤¯¡£³ä¤ê»»¤ò¼Â¹Ô¤·¤¿·ë²Ì¤ÏEAX¥ì¥¸¥¹¥¿¤Ë³ÊǼ¤µ¤ì¤ë¤¬¡¢¤³¤Î·ë²Ì¤¬32¥Ó¥Ã¥È¤Ë¼ý¤Þ¤é¤Ê¤¤¾ì¹ç¤Ë¤Ï#DE(divide error)Îã³°¤¬È¯À¸¤¹¤ë¡£

¾åµ¤Î¥¢¥»¥ó¥Ö¥ê¥³¡¼¥É¤Ç ¤Ï¡¢EDX¥ì¥¸¥¹¥¿¤ÎÃͤˤĤ¤¤Æ¤Ï°ìÀÚµ¤¤Ë¤·¤Æ¤¤¤Ê¤¤¤¿¤á¡¢¼Â¹Ô»þÅÀ¤Ç¤¿¤Þ¤¿¤ÞEDX¥ì¥¸¥¹¥¿¤ËÆþ¤Ã¤Æ¤¤¤¿Ãͤ¬¡¢³ä¤é¤ì¤ë¿ô¤Î¾å°Ì32¥Ó¥Ã¥È¤È¤·¤Æ»È¤ï¤ì ¤Æ¤·¤Þ¤Ã¤Æ¤¤¤ë¡£¤½¤Î¤Þ¤ÞIDIVÌ¿Îá¤ò¼Â¹Ô¤·¤Æ¤â¡¢¤Û¤È¤ó¤É¤Î¾ì¹ç³ä¤ê»»¤Î¼Â¹Ô·ë²Ì¤Ï32¥Ó¥Ã¥È¤Ë¼ý¤Þ¤é¤Ê¤¤¤¿¤á¤Ë¡¢Îã³°¤¬¾å¤¬¤ë¡¢¤È¤¤¤¦¤³¤È¤é¤·¤¤¡£
²ò ·è¤Î¼ê¤¬¤«¤ê¤òÆÀ¤ë¤¿¤á¤Ë¡¢Æ±Íͤη׻»¤ò¤¹¤ë¥¢¥»¥ó¥Ö¥ê¥³¡¼¥É¤òGCC¤Ç½ÐÎϤ·¡¢¤½¤ì¤òį¤á¤Æ¤ß¤ë¤È¡¢"cltd"¤È¤¤¤¦Ì¿Î᤬»È¤ï¤ì¤Æ¤¤¤ë¤³¤È¤Ëµ¤¤¬¤Ä ¤¤¤¿¡£¤È¤³¤í¤¬Intel¤Î"IA-32 Intel Architecture Software Developer’s Manual"¤ò¸«¤Æ¤â¡¢ ¤½¤Î¤è¤¦¤Ê̾Á°¤ÎÌ¿Îá¤Ï¸«Åö¤¿¤é¤Ê¤¤¡£¤½¤Î¤Þ¤Þ»È¤Ã¤Æ¤·¤Þ¤Ã¤Æ¤â¤¤¤¤¤Î¤À¤¬¡¢²¿¤ò¤¹¤ëÌ¿Îᤫʬ¤«¤é¤Ê¤¤¤Þ¤Þ¤È¤¤¤¦¤Î¤âµ¤»ý¤Á¤¬°¤¤¡£
¤¤ ¤í¤¤¤í¤È»ñÎÁ¤òõ¤·¤¿¤¢¤²¤¯¡¢as(GNU Assembler)¤Î¥Þ¥Ë¥å¥¢¥ë¤Ë¤¢¤ë"Opcode Naming"¤Î¹à¤ò¸«¤¿¤È¤³¤í¡¢IntelµË¡¡Ê¥Ë¡¼¥â¥Ë¥Ã¥¯¡Ë¤Ç"cltd"¤ËÁêÅö¤¹¤ë¤Î¤Ï"CDQ"¤È¤¤¤¦Ì¿Îá¤Ç¤¢¤ë¤³¤È¤¬Ê¬ ¤«¤Ã¤¿¡£¤Þ¤¿¡¢ÀâÌÀʸ¤Ë"sign-extend dword in `%eax' to quad in `%edx:%eax'"¤È½ñ¤«¤ì¤Æ¤¤¤ë¤È¤³¤í¤«¤é¤·¤Æ¤â¡¢º£²ó¤Î¤è¤¦¤ÊÉ乿ÉÕ¤À°¿ô¤Î³ä¤ê»»¤ò¼Â¹Ô¤¹¤ëÁ°¤Ëɬ ÍפÊÌ¿Îá¤Ç¤¢¤ë¤³¤È¤¬¸«¤Æ¼è¤ì¤ë¡£¤È¤¤¤¦¤³¤È¤Ç¥³¥ó¥Ñ¥¤¥é¤ò½¤Àµ¤·¡¢°Ê²¼¤Î¤è¤¦¤Ê¥¢¥»¥ó¥Ö¥ê¥³¡¼¥É¤¬½ÐÎϤµ¤ì¤ë¤è¤¦¤Ë¤·¤¿¡£
movl $6, %eax
cltd ←¥³¥ì¤òÄɲÃ
movl $2, %ebx
idivl %ebx
¤³
¤ì¤Ë¤Æ°ì·ïÍîÃå¡£"Floating Point
Exception"¤â½Ð¤Ê¤¯¤Ê¤Ã¤¿¤·¡¢printint()´Ø¿ô¤â¤¦¤Þ¤¯Æ°ºî¤·¤Æ¤¤¤ë¤è¤¦¤À…¤¬¡¢¤½¤ì¤Ë¤·¤Æ¤âÀ°¿ô¤Î³ä¤ê»»¤Ç
¡ÖÉâÆ°¾®¿ôÅÀ±é»»¤ÎÎã³°¡×¤È½Ð¤ë¤Î¤Ï°ìÂΤʤ¼¤Ê¤Î¤À¤í¤¦¡©
¤³¤¦¤¤¤¦·Ð°Þ¤«¤â¤·¤ì¤Ê¤¤¤½¤¦¤Ç¤¹¡£
http://cclub.cc.tut.ac.jp/~pakuchan/hoge/2004/9/28
#»²¹Í¤Ë¤Ê¤ê¤Þ¤·¤¿¡¢¤É¤¦¤â
¤¢¤ê¤¬¤È¤¦¤´¤¶¤¤¤Þ¤¹¡£¥ê¥ó¥¯Àè¤Î¾ðÊó¤Ï¤³¤Î¥Ê¥¾¤ËÂФ¹¤ëÎɤ¤ÆÍÇ˸ý¤Ë¤Ê¤ê¤Þ¤·¤¿¡£
SIGFPE¤ÈINTDIV¤ò¥¡¼¥ï¡¼¥É¤Ëõ¤¹¤Î¤¬¥ß¥½¤ß¤¿¤¤¤Ç¤¹¤Í¡£
http://en.wikipedia.org/wiki/SIGFPE¤¢¤¿¤ê¤Ë¤Ï
Although SIGFPE does not necessarily involve floating-point arithmetic, there is no way to change its name without breaking backward compatibility.
¤È¤¤¤¦¥·¥ó¥×¥ë¤ÊÀâÌÀ¤¬¤¢¤ê¤Þ¤·¤¿¡£¤Ê¤ë¤Û¤É¡Ä¡Ä