汇编链接后的.exe文件 无法执行
;********************************************************************************************************; uC/OS-II; The Real-Time Kernel;; (c) Copyright 1992-2002, Jean J. Labrosse, Weston, FL; All Rights Reserved;;; 80x86/80x88 Specific code; LARGE MEMORY MODEL;; Borland C/C++ V4.51; (IBM/PC Compatible Target);; File : OS_CPU_A.ASM; By : Jean J. Labrosse;********************************************************************************************************;********************************************************************************************************; PUBLIC and EXTERNAL REFERENCES;******************************************************************************************************** PUBLIC _OSTickISR PUBLIC _OSStartHighRdy PUBLIC _OSCtxSw PUBLIC _OSIntCtxSw EXTRN _OSIntExit:NEAR EXTRN _OSTimeTick:NEAR EXTRN _OSTaskSwHook:NEAR EXTRN _OSIntNesting:BYTE EXTRN _OSTickDOSCtr:BYTE EXTRN _OSPrioHighRdy:BYTE EXTRN _OSPrioCur:BYTE EXTRN _OSRunning:BYTE EXTRN _OSTCBCur:DWORD EXTRN _OSTCBHighRdy:DWORD.MODEL SMALL.CODE.186 PAGE ; /*$PAGE*/;*********************************************************************************************************; START MULTITASKING; void OSStartHighRdy(void);; The stack frame is assumed to look as follows:;; OSTCBHighRdy->OSTCBStkPtr --> DS (Low memory); ES; DI; SI; BP; SP; BX; DX; CX; AX; OFFSET of task code address; SEGMENT of task code address; Flags to load in PSW; OFFSET of task code address; SEGMENT of task code address; OFFSET of 'pdata'; SEGMENT of 'pdata' (High memory);; Note : OSStartHighRdy() MUST:; a) Call OSTaskSwHook() then,; b) Set OSRunning to TRUE,; c) Switch to the highest priority task.;*********************************************************************************************************_OSStartHighRdy PROC MOV AX, SEG _OSTCBHighRdy ; Reload DS MOV DS, AX ;; CALL FAR PTR _OSTaskSwHook ; Call user defined task switch hook; MOV AL, 1 ; OSRunning = TRUE; MOV BYTE PTR DS:_OSRunning, AL ; (Indicates that multitasking has started); LES BX, DWORD PTR DS:_OSTCBHighRdy ; SS:SP = OSTCBHighRdy->OSTCBStkPtr MOV SS, ES:[BX+2] ; MOV SP, ES:[BX+0] ;; POP DS ; Load task's context POP ES ; POPA ;; IRET ; Run task_OSStartHighRdy ENDP PAGE ; /*$PAGE*/;*********************************************************************************************************; PERFORM A CONTEXT SWITCH (From task level); void OSCtxSw(void);; Note(s): 1) Upon entry,; OSTCBCur points to the OS_TCB of the task to suspend; OSTCBHighRdy points to the OS_TCB of the task to resume;; 2) The stack frame of the task to suspend looks as follows:;; SP -> OFFSET of task to suspend (Low memory); SEGMENT of task to suspend; PSW of task to suspend (High memory);; 3) The stack frame of the task to resume looks as follows:;; OSTCBHighRdy->OSTCBStkPtr --> DS (Low memory); ES; DI; SI; BP; SP; BX; DX; CX; AX; OFFSET of task code address; SEGMENT of task code address; Flags to load in PSW (High memory);*********************************************************************************************************_OSCtxSw PROC ; PUSHA ; Save current task's context PUSH ES ; PUSH DS ;; MOV AX, SEG _OSTCBCur ; Reload DS in case it was altered MOV DS, AX ;; LES BX, DWORD PTR DS:_OSTCBCur ; OSTCBCur->OSTCBStkPtr = SS:SP MOV ES:[BX+2], SS ; MOV ES:[BX+0], SP ;; CALL FAR PTR _OSTaskSwHook ; Call user defined task switch hook; MOV AX, WORD PTR DS:_OSTCBHighRdy+2 ; OSTCBCur = OSTCBHighRdy MOV DX, WORD PTR DS:_OSTCBHighRdy ; MOV WORD PTR DS:_OSTCBCur+2, AX ; MOV WORD PTR DS:_OSTCBCur, DX ;; MOV AL, BYTE PTR DS:_OSPrioHighRdy ; OSPrioCur = OSPrioHighRdy MOV BYTE PTR DS:_OSPrioCur, AL ;; LES BX, DWORD PTR DS:_OSTCBHighRdy ; SS:SP = OSTCBHighRdy->OSTCBStkPtr MOV SS, ES:[BX+2] ; MOV SP, ES:[BX] ;; POP DS ; Load new task's context POP ES ; POPA ;; IRET ; Return to new task;_OSCtxSw ENDP PAGE ; /*$PAGE*/