Mercurial > hg > CbC > old > device
changeset 480:5c497d547c0b
*** empty log message ***
author | kono |
---|---|
date | Sat, 26 Nov 2005 09:55:49 +0900 |
parents | 51c1b795b4f3 |
children | 6445b419aef0 |
files | Changes |
diffstat | 1 files changed, 41 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/Changes Sat Nov 26 09:50:55 2005 +0900 +++ b/Changes Sat Nov 26 09:55:49 2005 +0900 @@ -7266,4 +7266,44 @@ と union だけdispが特別扱いのようですが... あんまりテストされてないなぁ。 - +Sat Nov 26 09:53:48 JST 2005 + +MIPS で、 +code segment 中の float/double conversion の後で大域変数にアクセスすると +code dump する件ですが... + + l.s $f12,16($11) + jal fptodp + sw $2,16($sp) + sw $3,20($sp) + +0x400ab0 in print_foo () +pc =00400ab0 fp =7ffff900 r2 =00000012 r3 =00000003 r4= 7ffff670 r5= 00000000 +r6 =00000012 r7 =00000000 r8 =00000c00 r9 =00000010 r10=00000000 r11=10000130 +0x400ab0 <print_foo+32>: jalr $t9 +(gdb) ni +0x400ab8 in print_foo () +pc =00400ab8 fp =7ffff900 r2 =00000000 r3 =40100000 r4= 00000000 r5= 800fffff +r6 =7fffffff r7 =00000000 r8 =00000000 r9 =00100000 r10=00000000 r11=00000401 +0x400ab8 <print_foo+40>: lw $gp,64($s8) +(gdb) p (void*)((int)$gp) +$3 = (void *) 0x10008030 +(gdb) si +0x400abc in print_foo () +pc =00400abc fp =7ffff900 r2 =00000000 r3 =40100000 r4= 00000000 r5= 800fffff +r6 =7fffffff r7 =00000000 r8 =00000000 r9 =00100000 r10=00000000 r11=00000401 +0x400abc <print_foo+44>: sw $v0,16($sp) +(gdb) p (void*)((int)$gp) +$4 = (void *) 0x0 + + +わかりました。code segment の中では jal じゃなくて + + la $25,fptodp + jalr $25 + lw $gp,$L_7($sp) + +しなきゃいけなかったんだ。なんでそうかは忘れた。($fp を使われちゃうからなのね) + + +