¥È¥Ã¥× «Á°¤ÎÆüµ­(2006-06-08) ºÇ¿· ¼¡¤ÎÆüµ­(2006-07-01)» ÊÔ½¸

Rogue Engineer's Diary / ¤ä¤µ¤°¤ìÆüµ­

Categories | CPU¤ÎÁϤ꤫¤¿ | Modern Compiler Implementation in ML | NerdTV | PDP-11¥·¥ß¥å¥ì¡¼¥¿¤Ç¸ÅÂå¤ÎUNIX¤òư¤«¤·¤Æ¤ß¤ë | The Yakumo Project | ¤ä¤µ¤°¤ìÆÉ½ñÏ¿
ºÇ¶á¤Î¥Ä¥Ã¥³¥ß:1.bag781(2009-06-26 12:58)  2.Rhett Trappman(2009-06-22 09:26)  3.Rhett Trappman(2009-06-22 09:24)
ºÇ¶á¤Î¥È¥é¥Ã¥¯¥Ð¥Ã¥¯:1.Ç»½Ì´Ô¸µ¥ª¥ì¥ó¥¸¥Ë¥å¡¼¥¹:¥×¥í.. (2006-12-22 22:02)

2004|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|09|

2006-06-15

¢£ [Modern Compiler Implementation in ML] ³ä¤ê»»¤Î¥ï¥Ê

¥Æ¥¹¥È¥×¥í¥°¥é¥à¤ò¼Â¹Ô¤·¤Æ·ë²Ì¤ò³Îǧ¤·¤è¤¦¤È»×¤¦¤È¡¢Ê¸»úÎó¤À¤±¤Ç¤Ê¤¯¿ôÃͤâɽ¼¨¤µ¤»¤¿¤¯¤Ê¤ë¡£¤À¤¬ 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()´Ø¿ô¤â¤¦¤Þ¤¯Æ°ºî¤·¤Æ¤¤¤ë¤è¤¦¤À…¤¬¡¢¤½¤ì¤Ë¤·¤Æ¤âÀ°¿ô¤Î³ä¤ê»»¤Ç ¡ÖÉâÆ°¾®¿ôÅÀ±é»»¤ÎÎã³°¡×¤È½Ð¤ë¤Î¤Ï°ìÂΤʤ¼¤Ê¤Î¤À¤í¤¦¡©

ËÜÆü¤Î¥Ä¥Ã¥³¥ß(Á´2·ï) [¥Ä¥Ã¥³¥ß¤òÆþ¤ì¤ë]
# ¥Õ¥ë¥¿¥Ë¥¢¥ó (2006-10-20 13:10)

¤³¤¦¤¤¤¦·Ð°Þ¤«¤â¤·¤ì¤Ê¤¤¤½¤¦¤Ç¤¹¡£
http://cclub.cc.tut.ac.jp/~pakuchan/hoge/2004/9/28
#»²¹Í¤Ë¤Ê¤ê¤Þ¤·¤¿¡¢¤É¤¦¤â

# Ê¡À¹ (2006-10-23 20:06)

¤¢¤ê¤¬¤È¤¦¤´¤¶¤¤¤Þ¤¹¡£¥ê¥ó¥¯Àè¤Î¾ðÊó¤Ï¤³¤Î¥Ê¥¾¤ËÂФ¹¤ëÎɤ¤ÆÍÇ˸ý¤Ë¤Ê¤ê¤Þ¤·¤¿¡£
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.

¤È¤¤¤¦¥·¥ó¥×¥ë¤ÊÀâÌÀ¤¬¤¢¤ê¤Þ¤·¤¿¡£¤Ê¤ë¤Û¤É¡Ä¡Ä

Name / ¤ªÌ¾Á°:
E-mail:
Comment / ¥³¥á¥ó¥È
(To English posters: please do not remove the extra characters in the comment area):
ËÜÆü¤Î¥ê¥ó¥¯¸µ


Ê¡À¹½¨Íº/Hideo Fukumori

Visitors Count: 236(yesterday) / 44(today) / 339114(total)