> I set EAX before starting the executable, but still no luck :( > On Plan 9, for /bin/mk: > > acid: symbols("_tos") > _tos D 0x00016084 > acid: mem(0x00016084, "X") > 0xdfffefc8 > > I'm probing address 0x16084 on linux after every instruction (using > ptrace's singlestep), and it consistently returns 0. EIP at the > beginning of the program is 0x9fe4, and sure enough: > > acid: asm(0x9fe4) > _main SUBL $0x48, SP > _main+0x3 MOVL AX, _tos(SB) > ... > > So (MOVL, _tos(SB)) is definitely executed, but for some reason, the > value of AX is not stored in 0x16084.
You should print AX after every instruction too, to see if you've actually set it up the way you think you did. > That brings me to the question > of how 8a decides what address to put values like that in? Is the > address the same everytime, i.e. hardcoded into the binary? (certainly > seems to be) _tos is no different than any other global variable. 8a doesn't use any address at all - it leaves a slot for 8l to fill in. The eventual address of _tos depends on what other data is in the binary. I don't know why you say the address is the same every time: cpu% nm /bin/cat |grep _tos 600c D _tos cpu% nm /bin/ls |grep _tos d060 D _tos cpu% nm /bin/echo |grep _tos 9008 D _tos cpu% > I strip the symbol table from plan 9 executables and store only data, > text and initialize bss in memory - maybe that has something to do > with it. Does the symbol table need to be in memory too for > instructions like (MOVL AX, _tos(SB)) to work? No, the symbol table is only for debuggers and the like. Plan 9 doesn't load it into memory either. The good news is that you've identified the program behaving incorrectly after executing only *two* instructions. That should narrow things down considerably. Russ