+ -
当前位置:首页 → 问答吧 → ntvdm cpu 遇到无效的指令 汇编题目

ntvdm cpu 遇到无效的指令 汇编题目

时间:2010-12-06

来源:互联网

;主程序
EXTRN COMPUTE: FAR
PUBLIC COUNT, X, Y, R

;--------------------------------------------------------------
D_SEG SEGMENT 
COUNT DW 10H
X DW 10H DUP (?)
Y DW 10H DUP (?)
D_SEG ENDS
;--------------------------------------------------------------
E_SEG SEGMENT 
R DW 10H DUP (?)
E_SEG ENDS
;--------------------------------------------------------------
STACK SEGMENT STACK
DB 200 DUP(0)
 STACK ENDS
  
C_SEG SEGMENT  
ADDITION PROC FAR

ASSUME CS: C_SEG, DS: D_SEG, ES: E_SEG,SS:STACK
START:
PUSH DS
SUB AX, AX
PUSH AX

MOV AX, D_SEG
MOV DS, AX
MOV AX, E_SEG
MOV ES, AX

CALL FAR PTR COMPUTE ;调用求和子程序
RET

ADDITION ENDP

C_SEG ENDS
;-----------------------------------------------------------------
END ADDITION

***********************************************************************************
;求和子程序

EXTRN COUNT:WORD, X:WORD, Y:WORD, R:WORD

PUBLIC COMPUTE

;-----------------------------------------------------------------

CODESG SEGMENT  

ASSUME CS: CODESG

COMPUTE PROC FAR ;不同模块的求和子程序

NEXT:
MOV CX, COUNT
MOV BX, 0
  MOV AX, X[BX]
ADD AX, Y[BX]
SUB AX, 3
MOV ES: R[BX], AX

LOOP NEXT


POP AX
POP DS

RET

COMPUTE ENDP

;-----------------------------------------------------------------

CODESG ENDS

;********************************************

END

程序编译正确,运行报错:

ntvdm cpu 遇到无效的指令
CS:0000 IP:0077 OP:f0 37 05 14 02

不知道问题出在哪里, 调试程序main:

-u
13F1:0000 1E PUSH DS
13F1:0001 2BC0 SUB AX,AX
13F1:0003 50 PUSH AX
13F1:0004 B8DD13 MOV AX,13DD
13F1:0007 8ED8 MOV DS,AX
13F1:0009 B8E213 MOV AX,13E2
13F1:000C 8EC0 MOV ES,AX
13F1:000E 9A00000000 CALL 0000:0000
13F1:0013 CB RETF
13F1:0014 0000 ADD [BX+SI],AL
13F1:0016 0000 ADD [BX+SI],AL
13F1:0018 0000 ADD [BX+SI],AL
13F1:001A 0000 ADD [BX+SI],AL
13F1:001C 0000 ADD [BX+SI],AL
13F1:001E 0000 ADD [BX+SI],AL

发现调用子程序的地址是0000:0000,这是系统分配的区域,不知道为什么会这样,大家谁知道帮忙解决下。。。



作者: hm315   发布时间: 2010-12-06

“ntvdm cpu 遇到无效的指令”是因为SP没赋值造成。

“调用子程序的地址是0000:0000”还没仔细看。

作者: shzhfu   发布时间: 2010-12-06

引用 1 楼 shzhfu 的回复:

“ntvdm cpu 遇到无效的指令”是因为SP没赋值造成。

“调用子程序的地址是0000:0000”还没仔细看。


请问怎么赋值呢,在哪赋值,我是新手,不是很清楚~

作者: hm315   发布时间: 2010-12-06

出现这类提示,通常是栈的原意

作者: masmaster   发布时间: 2010-12-06