标题:程序执行错误,B800段内存无法写入
取消只看楼主
ehszt
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:40
帖 子:1728
专家分:3216
注 册:2015-12-2
结帖率:100%
已结贴  问题点数:20 回复次数:5 
程序执行错误,B800段内存无法写入
STACKS SEGMENT
    dw 10 dup(0)
STACKS ENDS
data segment
    db 10 dup(0)
data ends

code  segment
assume  cs:code,ss:stacks,ds:data
start:   
        mov ax,stacks
        mov ss,ax
        mov sp,20
        mov ax,12666
        mov bx,data
        mov ds,bx
        mov si,0
        call dtoc
        
        mov dh,8
        mov dl,3
        mov cl,2
        call show_str
               
        mov ax, 4c00h
        int 21h

dtoc:
        add si,2
        mov bx,10
        mov dx,0
    s:  div bx
        mov cx,ax
        add dx,30h
        mov ds:[si],dx
        mov dx,0
        jcxz ok
        add si,2
        jmp short s
        ok: ret

show_str:
        mov al,0a0h
        mul dh
        mov bx,ax
        mov al,2
        mul dl
        add bx,ax
        mov ax,0b800h
        mov es,ax
    s1:
        mov ch,0
        push cx
        mov cx,si
        jcxz ok1
        pop cx
        mov es:[bx+1],cl  ;调试到这一段发现,cl的2无法写入到es:[507]中,指令运行完es:[507]中是F0
        mov al,ds:[si]
        mov es:[bx],al    ;es:[506]中是20,而不是31
        add bx,2
        sub si,2
        jmp short s1
        ok1:ret
code  ends
end   start
搜索更多相关主题的帖子: 写入 data code add mov 
2020-07-30 22:22
ehszt
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:40
帖 子:1728
专家分:3216
注 册:2015-12-2
得分:0 
不用debug程序也不能正常执行啊,有什么办法吗?之前这个子程序是可以正常执行的。
2020-07-31 10:04
ehszt
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:40
帖 子:1728
专家分:3216
注 册:2015-12-2
得分:0 
谢谢,有好多指令我还没学到,先保存起来,到时候再看吧!
2020-07-31 14:41
ehszt
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:40
帖 子:1728
专家分:3216
注 册:2015-12-2
得分:0 
程序按版主所说稍做修改
STACKS SEGMENT
    dw 10 dup(0)
STACKS ENDS
data segment
    db 10 dup(0)
data ends

code  segment
assume  cs:code,ss:stacks,ds:data
start:   
        mov ax,stacks
        mov ss,ax
        mov sp,10
        mov ax,12666
        mov bx,data
        mov ds,bx
        mov si,0
        call dtoc
        
        mov dh,8
        mov dl,3
        mov cl,2
        call show_str      
        mov ax, 4c00h
        int 21h

dtoc:
        inc si
        mov bx,10
        mov dx,0
    s:  div bx
        mov cx,ax
        add dl,30h
        mov ds:[si],dl
        mov dx,0
        jcxz ok
        inc si
        jmp short s
        ok: ret

show_str:
        mov al,0a0h
        mul dh
        mov bx,ax
        mov al,2
        mul dl
        add bx,ax
        mov ax,0b800h
        mov es,ax
    s1: mov ch,0
        push cx
        mov cx,si
        jcxz ok1
        pop cx
        mov al,ds:[si]
        mov ah,cl
        mov es:[bx],ax
        add bx,2
        dec si
        jmp short s1
        ok1:ret
code  ends
end   start
可是我用debug监控,在show_str程序结束后不是运行mov ax,4c00h,而是运行一个ADC ax,d08e的指令
从而导致程序死循环,请问是为什么,截图如下:










2020-07-31 22:04
ehszt
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:40
帖 子:1728
专家分:3216
注 册:2015-12-2
得分:0 
回复 8楼 Valenciax
这样改真的可以了,不知道是为什么,是因为栈的原因吗?还是说jcxz只能在程序中用一次
2020-08-01 17:51
ehszt
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:40
帖 子:1728
专家分:3216
注 册:2015-12-2
得分:0 
哦,知道了,谢谢!!
2020-08-01 18:44



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-502700-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020070 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved