void HandleFuncExc(TreeNode* pnode){ FuncList varList=funcListLookup(pnode->attr.name); EMITCODE("pushl %eax\n"); PushParam(pnode->child[0]); EMITCODE("pushl %ecx\n"); EMITCODE("movl %esp, %ecx\n"); sprintf(tmp, "call %s\n", pnode->attr.name); EMITCODE(tmp); EMITCODE("popl %ecx\n"); PopParam(pnode->child[0],varList->paraList); EMITCODE("popl %eax\n"); }
static void PVWrite (CPURegs* Regs) { unsigned char* Data; unsigned RetVal, I = 0; unsigned Count = GetAX (Regs); unsigned Buf = PopParam (2); unsigned FD = PopParam (2); Print (stderr, 2, "PVWrite ($%04X, $%04X, $%04X)\n", FD, Buf, Count); Data = xmalloc (Count); while (I < Count) { Data[I++] = MemReadByte (Buf++); } RetVal = write (FD, Data, Count); xfree (Data); SetAX (Regs, RetVal); }
void PopParam(TreeNode* pnode,SimpleTypeList varList){ if (pnode==NULL || varList==NULL) return; if (varList->isVar==1){ HandleNodeExp(pnode); EMITCODE("popl %eax\n"); EMITCODE("movl %eax, (%esi)\n"); } else EMITCODE("popl %eax\n"); PopParam(pnode->sibling,varList->next); }
static void PVRead (CPURegs* Regs) { unsigned char* Data; unsigned RetVal, I = 0; unsigned Count = GetAX (Regs); unsigned Buf = PopParam (2); unsigned FD = PopParam (2); Print (stderr, 2, "PVRead ($%04X, $%04X, $%04X)\n", FD, Buf, Count); Data = xmalloc (Count); RetVal = read (FD, Data, Count); if (RetVal != (unsigned) -1) { while (I < RetVal) { MemWriteByte (Buf++, Data[I++]); } } xfree (Data); SetAX (Regs, RetVal); }