首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 汇编语言 >

汇编链接后的.exe文件 无法执行解决方法

2012-02-20 
汇编链接后的.exe文件 无法执行Assembly code********************************************************

汇编链接后的.exe文件 无法执行

Assembly code
;********************************************************************************************************;                                               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*/ 





[解决办法]
你用虚拟机安装一个纯dos才能运行。比如
MOV AL, 20H ; Move EOI code into AL.
MOV DX, 20H ; Address of 8259 PIC in DX.
OUT DX, AL ; Send EOI to PIC if not processing DOS timer.
直接操作时钟芯片的端口读写。不能在虚拟dos下用

热点排行