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

阳明阳明 2010-01-27 11:59:59

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




...全文
444 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
亲休息吧 2012-01-03
  • 打赏
  • 举报
回复
只编译这个汇编可以运行?还有其他的函数文件吧!
阳明阳明 2010-01-30
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 gogdizzy 的回复:]
引用 6 楼 xinxintai 的回复:
dosbox是干什么用的?


dos模拟器,可以在winxp以后的版本中使用(winxp以后的OS就不支持16位的程序了。),能够执行16位程序。
[/Quote]



上面的程序能在dosbox上跑吗
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 xinxintai 的回复:]
上面的程序能在dosbox上跑吗
[/Quote]

我也不清楚,事实上,我不知道你的程序都会调用什么。不过普通的汇编16位程序都可以跑,我还用dosbox玩主题医院了。
xusir98 2010-01-30
  • 打赏
  • 举报
回复
进来学习一下,呵呵!
lz3771 2010-01-30
  • 打赏
  • 举报
回复
mark
  • 打赏
  • 举报
回复
应该可以,windows 3.1、95、98都可以在dosbox上安装运行,玩老系统,dosbox绝对是最好的虚拟机,比vmware、virtual pc、virtual box都强。
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 xinxintai 的回复:]
dosbox是干什么用的?
[/Quote]

dos模拟器,可以在winxp以后的版本中使用(winxp以后的OS就不支持16位的程序了。),能够执行16位程序。
阳明阳明 2010-01-29
  • 打赏
  • 举报
回复
dosbox是干什么用的?
阳明阳明 2010-01-28
  • 打赏
  • 举报
回复

;*********************************************************************************************************
; PERFORM A CONTEXT SWITCH (From an ISR)
; void OSIntCtxSw(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:
;
; OSTCBCur->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)
;
;
; 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)
;*********************************************************************************************************

_OSIntCtxSw PROC
;
CALL FAR PTR _OSTaskSwHook ; Call user defined task switch hook
;
MOV AX, SEG _OSTCBCur ; Reload DS in case it was altered
MOV DS, AX ;
;
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
;
_OSIntCtxSw ENDP

PAGE ; /*$PAGE*/
;*********************************************************************************************************
; HANDLE TICK ISR
;
; Description: This function is called 199.99 times per second or, 11 times faster than the normal DOS
; tick rate of 18.20648 Hz. Thus every 11th time, the normal DOS tick handler is called.
; This is called chaining. 10 times out of 11, however, the interrupt controller on the PC
; must be cleared to allow for the next interrupt.
;
; Arguments : none
;
; Returns : none
;
; Note(s) : The following C-like pseudo-code describe the operation being performed in the code below.
;
; Save all registers on the current task's stack;
; OSIntNesting++;
; if (OSIntNesting == 1) {
; OSTCBCur->OSTCBStkPtr = SS:SP
; }
; OSTickDOSCtr--;
; if (OSTickDOSCtr == 0) {
; OSTickDOSCtr = 11;
; INT 81H; Chain into DOS every 54.925 mS
; (Interrupt will be cleared by DOS)
; } else {
; Send EOI to PIC; Clear tick interrupt by sending an End-Of-Interrupt to the 8259
; PIC (Priority Interrupt Controller)
; }
; OSTimeTick(); Notify uC/OS-II that a tick has occured
; OSIntExit(); Notify uC/OS-II about end of ISR
; Restore all registers that were save on the current task's stack;
; Return from Interrupt;
;*********************************************************************************************************
;
_OSTickISR PROC
;
PUSHA ; Save interrupted task's context
PUSH ES
PUSH DS
;
MOV AX, SEG(_OSIntNesting) ; Reload DS
MOV DS, AX
INC BYTE PTR DS:_OSIntNesting ; Notify uC/OS-II of ISR
;
CMP BYTE PTR DS:_OSIntNesting, 1 ; if (OSIntNesting == 1)
JNE SHORT _OSTickISR1
MOV AX, SEG(_OSTCBCur) ; Reload DS
MOV DS, AX
LES BX, DWORD PTR DS:_OSTCBCur ; OSTCBCur->OSTCBStkPtr = SS:SP
MOV ES:[BX+2], SS ;
MOV ES:[BX+0], SP ;
;
_OSTickISR1:
MOV AX, SEG(_OSTickDOSCtr) ; Reload DS
MOV DS, AX
DEC BYTE PTR DS:_OSTickDOSCtr
CMP BYTE PTR DS:_OSTickDOSCtr, 0
JNE SHORT _OSTickISR2 ; Every 11 ticks (~199.99 Hz), chain into DOS
;
MOV BYTE PTR DS:_OSTickDOSCtr, 11
INT 081H ; Chain into DOS's tick ISR
JMP SHORT _OSTickISR3

_OSTickISR2:
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.
;
_OSTickISR3:
CALL FAR PTR _OSTimeTick ; Process system tick
;
CALL FAR PTR _OSIntExit ; Notify uC/OS-II of end of ISR
;
POP DS ; Restore interrupted task's context
POP ES
POPA
;
IRET ; Return to interrupted task
;
_OSTickISR ENDP
;
END


以上.asm文件,我用masm 软件编译生成.obj之后,用tc创建了一个工程,链接之后生成test.exe文件,运行test.exe文件后,出现对话框:ntvcm.exe已停止工作,Windows 可以联机检查该问题的解决方案。打开问题详细信息,如下:
问题签名:
问题事件名称: APPCRASH
应用程序名: ntvdm.exe
应用程序版本: 6.0.6001.18000
应用程序时间戳: 47918baf
故障模块名称: StackHash_1703
故障模块版本: 0.0.0.0
故障模块时间戳: 00000000
异常代码: c0000005
异常偏移量: 00000075
OS 版本: 6.0.6001.2.1.0.768.3
区域设置 ID: 2052
其他信息 1: 1703
其他信息 2: 2264db07e74365624c50317d7b856ae9
其他信息 3: 1344
其他信息 4: 875fa2ef9d2bdca96466e8af55d1ae6e
我用的是vista系统
紫郢剑侠 2010-01-28
  • 打赏
  • 举报
回复
有些底层操作在Windows中是不能直接进行的,除非你改写成驱动程序
  • 打赏
  • 举报
回复
你用虚拟机安装一个纯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下用
  • 打赏
  • 举报
回复
下载dosbox:www.dosbox.com
  • 打赏
  • 举报
回复
不愧是大师级的代码啊!!!
最实用,最简单编程软件。masm编程器汇编语言程序格式及MASM 汇编语言的实现也是先利用某种编辑器编写汇编语言源程序(*.ASM),然后经过汇编得到目标模块文件(*.OBJ)、连后形成可执行文件(*.EXE)。 1、汇编语言程序的语句格式 汇编语源程序由语句序列构成。语句一般由分隔符分成的四个部分组成,它们有两种格式: (1)执行性语句——由硬指令构成的语句,它通常对应一条机器指令,出现在程序的代码段中: 标号:硬指令助记符 操作数,操作数 ;注释 (2)说明性语句——由伪指令构成的语句,它通常指示汇编程序如何汇编源程序: 名字 伪指令助记符 参数,参数,... ;注释 ◆执行性语句中,冒号前的标号反映该指令的逻辑地址;说明性语句中的名字可以是变量名、段名、子程序名或宏名等等,既反映逻辑地址又具有自身的各种属性。标号和名字很容易通过是否具有冒号来区分。 ◆硬指令助记符可以是任何一条处理器指令,也可以是一条宏指令,伪指令助记符主要完成一些不产生CPU动作的说明性工作,在程序执行前由汇编程序完成处理。 ◆处理器指令的操作数可以是立即数、寄存器和存储单元。伪指令的参数可以是常数、变量名、表达式等,可以有多个,参数之间用逗号隔开。 ◆语句中由分号开始的部分是注释。 2、汇编语言源程序 这个以前已经学过,主要有简化段定义格式和完整段定义格式 3、宏汇编程序MASM MASM6.11,安装文件5张软盘,默认安装在C:\MASM目录下,完整的MASM汇编系统包含很多文件,但最基本的有如下几个: ML.EXE 汇编程序 ML.ERR 汇编错误信息文件 DOSXNT.EXE MS-DOS扩展文件 LINK.EXE文件 LIB.EXE 子程序库管理文件 如果采用集成开发环境PWB,主要涉及如下文件: PWWB.EXE 程序员工作平台 NMAKER.EXE 工程维护程序 NMAKE.EXE nmaker的MS-DOS扩展驱动程序 CV.EXE 源代码调试器CodeView CVPACK.EXE 调试信息压缩器,它为CODEVIEW准备一个可执行文件 HELPMAKE.EXE 帮助文件维护程序 BSCMAKE.EXE 浏览数据库创建程序 SBRPACK.EXE 浏览信息程序 PWBRMAKE.EXE BSCMAKE兼容驱动程序 *.MXT 各种PWB扩展工具文件 *.XXT 各种语言的PWB扩展文件 4、汇编语言的命令行开发过程 (1)原程序的编写 用编辑软件书写*.asm源程序,如 LI6-1.ASM ;LI6-1.ASM .MODEL SMALL .STACK .DATA STRING DB 'Hello,Everybody!' .CODE .STARTUP MOV DX,OFFSET STRING MOV AH,9 INT 21H .EXIT 0 END (2)原程序的汇编 汇编是将原程序翻译成由机器代码组成的目标模块文件的过程,如下: ML /c LI6-1.ASM 如果源程序没有语法错误,则生成一个目标模块文件LI6-1.OBJ (3)目标文件的连程序能把一个或多个目标文件和库文件和成一个可执行文件(.EXE、.COM文件),如下: LINK LI6-1.OBJ 连程序的一般格式: LINK [/参数选项] OBJ文件列表 [EXE文件名,MAP文件名,库文件][;] 连程序可以将多个模块文件起来,形成一个可执行文件;多个模块文件用“+”分隔。给出EE文件名就可以替代与第一个模块文件名相同的缺省名。给出MAP文件名将创建连映像文件,否则不生成映像文件。库文件是指连程序需要的子程序库等。“;”表示采用缺省值 事实上,ML汇编程序可以自动调用LINK连程序(ML表示MASM和LINK),实现汇编和连依次进行,如下即可完成可执行文件的生成: ML LI6-1.ASM ML的命令行格式如下: ML [/参数选项] 文件列表 [/LINK连参数选项] 参数选项如下(注意参数是大小写敏感的): /AT——允许tiny存储模式(创建一个COM文件) /c——只汇编源程序,不进行自动连 /fl 文件名——川建一个汇编列表文件(扩展名LST) /Fr 文件名——创建一个可在PWB下浏览的.SBR源浏览文件 /Fo 文件名——根据指定的文件名生成模块文件,而不是采用缺省名 /Fe 文件名——根据指定的文件名生成可执行文件,而不是采用缺省名 /Fm 文件名——创建一个连映像文件(扩展名MAP) /I 路径名——设置需要包含进(INCLUDE)源程序的文件的所在路径 /Sg——在生

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧