. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->CALL和RET指令
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  调试时,程序报错,"非法的指令"  [已解决] 回复[ 5次 ]   点击[ 373次 ]  
ptr
[帖 主]   [ 发表时间:2009-06-05 15:28 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:4
注册日期:2009-06-01 21:42
我把出错之前的代码贴出来,麻烦帮我看看,我找了很久都找不出原因呀!

DATAS SEGMENT
    ;此处输入数据段代码  
    DW 0,0
DATAS ENDS

STACKS SEGMENT
    ;此处输入堆栈段代码
    DW 1,2,3,4,5
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
    MOV SI,0
    
    MOV AX,STACKS
    MOV SS,AX
    MOV SP,10
    MOV BP,10
    
    MOV AX,4240H
    MOV DX,000FH
    MOV CX,0AH
    
    
    
    
    CALL DIVDW
    MOV AH,4CH
    INT 21H
DIVDW:
        PUSH AX
        PUSH DS
        PUSH SI
        PUSH DX
        PUSH CX
ptr
[第1楼]   [ 回复时间:2009-06-05 15:28 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:4
注册日期:2009-06-01 21:42
单步调试到PUSH CX,也就是我贴出来的最后一条指令出错!
zhenglxd
[第2楼]   [ 回复时间:2009-06-05 16:27 ]   [引用]   [回复]   [ top ] 
荣誉值:30
信誉值:0
注册日期:2009-04-09 10:05
我用你的代码自己debug了下,我估计是 sp值过小引发的
原先 sp=a
call 后 sp=8
到 push si 的时候发生了错误 (sp=4)

具体原因我不知道 这个属于debug 设计问题
但是 我百分百告诉你 是因为sp值过小 引发的
因为t中断 本身是个中断程序 中断过程中 需要利用栈来 保存数据
我觉的 当sp发生时如果sp小于6 那么就会引发错误 因为 我知道 t中断至少需要 6个字节大小的栈空间来 保护现场
ptr
[第3楼]   [ 回复时间:2009-06-05 16:33 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:4
注册日期:2009-06-01 21:42
你看我这记性!

辛苦了LS
ptr
[第4楼]   [ 回复时间:2009-06-11 10:23 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:4
注册日期:2009-06-01 21:42
有人说是win debug的一个bug!
ptr
[第5楼]   [ 回复时间:2009-06-11 10:24 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:4
注册日期:2009-06-01 21:42
此贴由 贴主 于 [ 2009-06-11 10:24 ] 结贴。 结贴原因:问题已解决
得分情况: 2楼(zhenglxd):8分  
此问题已结贴!
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved