注册 登录
编程论坛 汇编论坛

求调试,程序执行到mov ax,0b800h崩溃

神龙赖了 发布于 2013-02-22 11:49, 2246 次点击
assume cs:code ,  ss:stack

code segment
    db 'Welcome to masm!',0
code ends

stack segment

  dw 8 dup (0)
stack ends

code segment
    _start:mov dh,8
           mov dl,3
           mov cl,2
           
              mov ax,code
              mov ds,ax

              mov ax,stack
              mov ss,ax
              mov sp,16
     
           mov si,0
           call show_str
           
           mov ax,4c00h
           int 21h
           
     show_str:
               push si                      ;si记录字符串读取地
                                            ;dh记录行地址
                                            ;dl记录列数地址
               push cx                      ;ch记录读取字符
               push ax                      ;al记录字符属性
               push bx                      ;bx用来存放行的基础地址
               push dx
               
               mov  ax,0b800h
               mov  es,ax
        
                  mov ah,0
               mov al,0a0h
               mul dh
               mov bx,ax
               
               mov dh,0
               mov si,dx
               
               mov  al,cl
               mov  cl,0
              
          print: mov ch,ds:[si]                 ;如果ch为0,则跳出循环
          jcxz _out
                 mov es:[bx+si],ch
                 inc si
                 mov es:[bx+si+1],al
                 add dl,2
               jmp short print
      
         _out: pop dx
               pop bx      
               pop ax
               pop cx
               pop si
               ret
code ends

end _start


29 回复
#2
神龙赖了2013-02-22 11:50
巴嘎我知道了...
#3
神龙赖了2013-02-22 11:54
程序代码:
assume cs:code ,  ss:stack , ds:data

data segment
    db 'Welcome to masm!',0
data ends

stack segment

  dw 8 dup (0)
stack ends

code segment
    _start:mov dh,8
           mov dl,3
           mov cl,2
         
              mov ax,data
              mov ds,ax

              mov ax,stack
              mov ss,ax
              mov sp,16
   
           mov si,0
           call show_str
         
           mov ax,4c00h
           int 21h
         
     show_str:
               push si                      ;si记录字符串读取地
                                            ;dh记录行地址
                                            ;dl记录列数地址
               push cx                      ;ch记录读取字符
               push ax                      ;al记录字符属性
               push bx                      ;bx用来存放行的基础地址
               push dx
              
               mov  ax,0b800h
               mov  es,ax
      
                  mov ah,0
               mov al,0a0h
               mul dh
               mov bx,ax
              
               mov dh,0
               mov si,dx
              
               mov  al,cl
               mov  cl,0
            
          print: mov ch,ds:[si]                 ;如果ch为0,则跳出循环
          jcxz _out
                 mov es:[bx+si],ch
                 inc si
                 mov es:[bx+si+1],al
                 add dl,2
               jmp short print
      
         _out: pop dx
               pop bx     
               pop ax
               pop cx
               pop si
               ret
code ends

end _start


debug调试到mov ax,b800h时依然崩溃
#4
zklhp2013-02-22 13:17
搬砖中 楼主结题的时候记得给我点分
#5
TonyDeng2013-02-22 13:26
切分
#6
信箱有效2013-02-22 13:39
抢台词
#7
神龙赖了2013-02-22 13:42
好吧我已经做出来了...30分就这么没了,天哪坑爹的有木有啊...
#8
神龙赖了2013-02-22 13:49
再来几个切分的先,T版说得好啊,不以散分为目的的散分就是耍流氓,所以我不能耍流氓,啊...睡一觉先
#9
神龙赖了2013-02-22 16:19
z版那个masmplus汇编编辑器:

data segment
db 0
data ends

code segment
 mov ax,data
mov ax,data这一句怎么成非法的了?有什么办法能改成合法的吗?
#10
zklhp2013-02-22 16:39
以下是引用神龙赖了在2013-2-22 16:19:35的发言:

z版那个masmplus汇编编辑器:

data segment
db 0
data ends

code segment
 mov ax,data
mov ax,data这一句怎么成非法的了?有什么办法能改成合法的吗?

mov ax, seg data

行不行呢 不同版本有不同是正常的
#11
神龙赖了2013-02-22 17:41
symbol type conflict不行诶,你不是用这个编辑器吗?
还有木有别的办法
#12
zklhp2013-02-22 18:03
改成 data1 ?
#13
神龙赖了2013-02-22 18:38
  mov ax, seg data1
 error A2004: symbol type conflict
嗯...你用的不是这个编辑器啊,把你那个介绍给我用用好不咯
#14
zklhp2013-02-22 18:43
以下是引用神龙赖了在2013-2-22 18:38:25的发言:

  mov ax, seg data1
 error A2004: symbol type conflict
嗯...你用的不是这个编辑器啊,把你那个介绍给我用用好不咯

MASMPlus用的编译器是masm 如果你的用法没错最开始的就是对的 不知道你用的啥 怎么调的编译参数
#15
神龙赖了2013-02-22 19:38
总之你有办法没啊...
#16
zklhp2013-02-22 20:58
以下是引用神龙赖了在2013-2-22 19:38:44的发言:

总之你有办法没啊...


很简单啊 你换成和我测试的时候用的一样的不就行啦
#17
清微御宇2013-02-22 22:10
回复 3楼 神龙赖了
call show_str;ip入栈!
push si ;
push cx ;

push ax ;

push bx ;

push dx;
后sp=4但单步中断t命令后会伴随FR,cs,ip入栈,貌似申请的栈已经容纳不下ip了!
stack segment

  
dw 16 dup (0)


stack ends
后面的sp也改下
mov sp,32
试试!
#18
神龙赖了2013-02-22 23:38
我也考虑过这个问题,可是入栈的加上cs和ip一共只有七个16位寄存器啊,一个段至少有16个字节那应该容得下啊,恩,能不能解析下我的疑问
#19
神龙赖了2013-02-22 23:40
以下是引用zklhp在2013-2-22 20:58:30的发言:

 
 
很简单啊 你换成和我测试的时候用的一样的不就行啦
神马测试?T版你没把你那编辑器给我啊,这编辑器不懂用啊...
#20
清微御宇2013-02-23 07:31
回复 18楼 神龙赖了
你在程序一开始设置了ss和sp指向堆栈段底部下面是入栈寄存器
1.使用call命令降ip入栈;
2.push si将变址寄存器si入栈;
3.push ax
4.push bx
5.push cx
6.push dx
(在王爽的外中断中介绍-t单步调试的意义相当于
pushf;这是将标语寄存器FR入栈
TF=0,IF=0
push cs
push ip
)然后接着数
7.pushf
8.push cs
9.push ip
最后一个ip已经容纳不下了,肿么会只有7个寄存器入栈呢!
#21
神龙赖了2013-02-23 11:29
原理我明白了,难怪调试的时候会崩溃但是运行却没事,不过我记得在没申请栈空间的情况下t照样能正常运行啊,那时它会怎么存放呢?
#22
清微御宇2013-02-23 11:50
回复 21楼 神龙赖了
一个完整的源程序一般最好定义堆栈段。如果在程序中不定义堆栈段,那么,操作系统在装入该执行程序时将自动为其指定一个64K字节的堆栈段。如果没有定义堆栈段在编译时会给出警告:warning xxxx: no stack segment
#23
清微御宇2013-02-23 11:58
回复 21楼 神龙赖了
对于为什么会崩溃,还是希望你认真调试下,看问题是不是出在那,我这64位本,木有debug没法调试!
#24
TonyDeng2013-02-23 12:02
装备不赖嘛,有钱人家啊。
#25
清微御宇2013-02-23 12:07
回复 24楼 TonyDeng
3200的hp本2g内存,结果卖电脑的给我装了64位系统
#26
TonyDeng2013-02-23 12:11
换内存呗,趁现在便宜。
#27
清微御宇2013-02-23 12:17
自己不会,到学校看有木有修电脑的准备再加2g顺便把系统也给改成32位的
#28
TonyDeng2013-02-23 12:42
加内存换32位?傻的。
#29
神龙赖了2013-02-23 13:50
ok明白了,膜拜...
#30
网上随客2013-02-26 16:22
回复 27楼 清微御宇
直接自己买个内存插上去就行了。
1