. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->外中断
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  我在做实验15时遇到了一个问题,请前辈们帮助一下  [待解决] 回复[ 4次 ]   点击[ 766次 ]  
philmei
[帖 主]   [ 发表时间:2007-12-20 23:31 ]   [引用]   [回复]   [ top ] 
荣誉值:7
信誉值:10
注册日期:2007-11-26 03:32
程序编好后,我试运行了一下,我的DOS窗口一下子消失了,于是我进行debug单步跟踪。
当程序运行到mov word ptr es:[9*4],204h时,出现如下错误提示:
An internal stack overflow has caused this session to be halted. 
Change the STACKS setting in your CONFIG.SYS file, and then try again. 
我翻译一下: 
一个内部栈出现了溢出,这次的运行中断了。 
在你的CONFIG.SYS文件中改变栈设置,然后再试一遍。 

也不知道翻译的对不对。我把截图放到了我的学习博客里了,请前辈们指点一下,谢谢。

我的程序贴出来供大家参考。
assume cs:code
stack segment
db 128 dup (0)
stack ends
code segment
start:
        mov ax,stack
        mov ss,ax
        mov sp,128
        
        mov ax,cs
        mov ds,ax
        mov si,offset int9
        
        mov ax,0
        mov es,ax
        mov di,204h
        
        mov cx,offset int9end-offset int9
        cld
        rep movsb
        
        push es:[9*4]
        pop es:[200h]
        push es:[9*4+2]
        pop es:[202h]
        
        mov word ptr es:[9*4],204h
        mov word ptr es:[9*4+2],0
        
        mov ax,4c00h
        int 21h
        
int9:
        push ax
        push bx
        push cx
        push es
        
        in al,60h
        
        pushf
        call word ptr cs:[200h]
        
        cmp al,9eh
        jne int9ret
        
        mov ax,0B800h
        mov es,ax
        mov bx,0
        mov cx,2000
s:        inc byte ptr es:[bx]
        add bx,2
        loop s
        
int9ret:
        pop es
        pop cx
        pop bx
        pop ax
        iret
int9end:
        nop
code ends
end start
Wednesday
[第1楼]   [ 回复时间:2007-12-21 14:23 ]   [引用]   [回复]   [ top ] 
荣誉值:43
信誉值:3
注册日期:2007-07-05 19:53
int9: 
    push ax 
    push bx 
    push cx 
    push es 
     
    in al,60h 
     
    pushf 
    call dword ptr cs:[200h] ;    call word ptr cs:[200h] 这句错了 word 应为 dword     
    cmp al,9eh 
    jne int9ret 
     
    mov ax,0B800h 
    mov es,ax 
    mov bx,0 
    mov cx,2000 
s:    inc byte ptr es:[bx] ;能想到用这种方式将' '变成'!',很不简单,有创意,佩服
    add bx,2 
    loop s 
     
int9ret: 
    pop es 
    pop cx 
    pop bx 
    pop ax 
    iret 
int9end: 
    nop 

对于此程序执行过程中出现的异常,是因为中断向量的改变要求连续执行 无论是改变还是恢复过程。

在debug中用g命令执行项关语句即可。
abc58139966
[第2楼]   [ 回复时间:2007-12-22 13:15 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2007-10-24 17:00
cli
mov word ptr es:[9*4],204h 
mov word ptr es:[9*4+2],0 
sti
加上这两句在试一下.可能就没有问题了.
syzu
[第3楼]   [ 回复时间:2008-04-09 19:43 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:0
注册日期:2008-03-22 13:14
我来回答你,我也遇到同样的问题,但后来解决了.
syzu
[第4楼]   [ 回复时间:2008-04-09 19:47 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:0
注册日期:2008-03-22 13:14
s:    inc byte ptr es:[bx] 
这句话什么意思?又不是写颜色,你的inc什么?
照书上抄也要有水平
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved