On an i386, I am unable to get acid to properly report the values in the
floating point registers.
Could someone please explain what I am doing wrong ?
Thank you,
Philip Dye
- - - - -
Simple example:
#include <u.h>
#include <libc.h>
void main ( void )
{
double x ;
x = atof("3.5") ;
print("===== main x = %g\n",x) ;
exits(nil) ;
}
Use:
example : acid 8.out
8.out:386 plan 9 executable
/sys/lib/acid/port
/sys/lib/acid/386
acid: new()
7118: system call _main SUBL $0x48,SP
7118: breakpoint main+0x3 MOVL $.string(SB),AX
acid: asm(main)
main 0x00001020 SUBL $0x1c,SP
main+0x3 0x00001023 MOVL $.string(SB),AX
main+0x8 0x00001028 MOVL AX,0x0(SP)
main+0xb 0x0000102b CALL atof(SB)
main+0x10 0x00001030 FMOVDP F0,x+0x14(SP)
main+0x14 0x00001034 MOVL $.string+0x4(SB),AX
main+0x19 0x00001039 MOVL AX,0x0(SP)
main+0x1c 0x0000103c FMOVD x+0x14(SP),F0
main+0x20 0x00001040 FMOVDP F0,0x4(SP)
main+0x24 0x00001044 CALL print(SB)
main+0x29 0x00001049 ADDL $0x1c,SP
main+0x2c 0x0000104c RET
_main 0x0000104d SUBL $0x48,SP
acid: bpset(main+0x10)
acid: cont()
7118: breakpoint main+0x10 FMOVDP F0,x+0x14(SP)
acid: fpr()
F0 0.
F1 0.
F2 0.
F3 0.
F4 0.
F5 0.
F6 0.
F7 0.
control 0x0272
status 0x3900
tag 0x3fff
ip offset 0x00001743
cs selector 0x0023
opcode 0xe907
data operand offset 0xeee8
operand selector 0x001b
acid: print("===== ACID F0 = ",*(F0\F),"\n")
===== ACID F0 = 0
acid: cont()
===== main x = 3.5
7118: breakpoint main+0x14 MOVL $.string+0x4(SB),AX
<stdin>:9: (error) msg: pid=7118 startstop: process exited
- - - - -