z496032037 发表于 2012-6-30 21:37:16

实验十 这个程序为什么不能再屏幕显示字符? 哪错了? 数据放入现存的地址不对吗?

assume cs:code,ds:data,ss:stack
data segment
db 16 dup(0)
data ends

stack segment
db 16 dup(0)
stack ends

code segment
start:            mov ax,data
                  mov ds,ax
                  mov ax,stack
                  mov ss,ax
                  mov sp,16
                  mov ax,12666
                  mov si,0
                  call dtoc
   
                  mov dh,8
                  mov dl,3
                  mov si,0
                  mov bl,2
                  call show_str
   
                  mov ax,4c00h
                  int 21h
   
dtoc:            mov dx,0
                  mov bx,10
                  div bx
                  mov cx,ax
                  add dx,30h
                  push dx
                  inc si
                  jcxz dtoc_ok
                  jmp short dtoc
dtoc_ok:      mov cx,si
                  mov si,0
dtoc_s:         pop bx
                  mov ds:,bl
                  inc si
                  loop dtoc_s
                  mov ds:,byte ptr 0
                  ret
   
show_str:   mov al,160
                  mul dh
                  dec ax   
                  mov dx,ax
                  mov al,2
                  mul dl
                  dec ax
                  add ax,dx
                  add ax,0b800h
                  mov es,ax
                  mov bp,0
                  mov ch,0
show_s:       mov cl,ds:
                  jcxz show_ok
                  mov es:,cl
                  mov es:,bl
                  inc si
                  add bp,2
                  jmp short show_s
show_ok:   ret   
   
code ends
end start
   

jianqitao 发表于 2012-6-30 21:37:17

assume cs:code,ds:data,ss:stack
data segment
db 16 dup(0)
data ends

stack segment
db 16 dup(0)
stack ends

code segment
start:   mov ax,data      ax=data
         mov ds,ax      ds=data
         mov ax,stack   ax=stack
         mov ss,ax      ss=stack
         mov sp,16      sp=16
         mov ax,12666   ax=12666
         mov si,0         si=0
         call dtoc      跳到标号处
                            返回后,ax=0,bx=6,cx=0,dx=36h,si=5
                                    data:0=31hdata:1~4=36h,data:5~15=0
         mov dh,8         
         mov dl,3
         mov si,0
         mov bl,2         bx=2
         call show_str    跳到标号处
                            返回后各内存值:
                                          bd04:0=31h,bd04:1~8=36h
                                  (这个就是你执行后的结果了)
         mov ax,4c00h
         int 21h
   
dtoc:   mov dx,0            dx=0......
         mov bx,10      bx=10.....
         div bx         ax=1266,dx=6,ax=126,dx=6,....ax=0,dx=1
         mov cx,ax      cx=1266,cx=126,cx=12,cx=1,cx=0
         add dx,30h       dx=36h,dx=36h,dx=36h,dx=36h,dx=31h
         push dx          pop 36,pop 366,pop 36h,pop36h,pop31h
         inc si         si=1,si=2,si=3,si=4,si=5
         jcxz dtoc_ok   第5次cx=0,跳
         jmp short dtoc   此处跳转4次
dtoc_ok:   mov cx,si      cx=5
         mov si,0         si=0
dtoc_s:    pop bx         bx=31h          第二次:bx=36h   ..........bx=36h
         mov ds:,bl   data:0=31h            data:1=36h   .........一直到data:4=36h
         inc si         si=1                  si=2       ..........
         loop dtoc_s      跳4次               si最后=5
         mov ds:,byte ptr 0      data:5和data:6的值无改变,为0
         ret            返回
   
show_str:mov al,160       al=160=a0h
         mul dh         ax=1280
         dec ax         ax=1279
         mov dx,ax      dx=1279
         mov al,2         al=2
         mul dl         ax=6
         dec ax         ax=5
         add ax,dx      ax=1284
         add ax,0b800h    ax=bd04h
         mov es,ax      es=bd04h
         mov bp,0         bp=0
         mov ch,0         ch=0
show_s:    mov cl,ds:   cl=data:0=31h   第二次:cl=data:1=36h....cl=data:4=36h    cl=data:5=0
         jcxz show_ok   cx=31h                  cx=36h         ....cl=36h         cx=0 跳
         mov es:,cl   bd04:0=31h,            bd04:2=36h   ....bd04:8=36h
                           即第7行第2个               
                        从第0行第0个开始数
         mov es:,bl    bd04:1=36h            bd04:3=36h    ....bd04:7=36h
         inc si            si=1                  si=2          ....si=5
         add bp,2            bp=2                  bp=4          ....bp=10
         jmp short show_s    跳                     跳         ....不跳
show_ok:   ret               返回
   
code ends
end start

jianqitao 发表于 2012-7-1 00:33:15

本帖最后由 jianqitao 于 2012-7-1 01:35 编辑

编译时通过的,我帮你人肉单步跟踪调试了一下,错误挺多,自己看吧
assume cs:code,ds:data,ss:stack
data segment
db 16 dup(0)
data ends
stack segment
db 16 dup(0)
stack ends
code segment
start:   mov ax,data      ax=data
         mov ds,ax      ds=data
         mov ax,stack   ax=stack
         mov ss,ax      ss=stack
         mov sp,16      sp=16
         mov ax,12666   ax=12666
         mov si,0         si=0
         call dtoc      跳到标号处
                            返回后,ax=1266,bx=6,cx=0,dx=36h,si=2
                                    data:0=6,data:1=6,其他内存和寄存器无变化
         mov dh,8         
         mov dl,3
         mov si,0
         mov bl,2         bx=2
         call show_str    跳到标号处
                            返回后各内存值:data:0=6,data:1=6,data:3~15=0
                                          bd04:0=6,bd04:1=6,其他为0,无变化   
                                  (这个就是你执行后的结果了)
         mov ax,4c00h
         int 21h
   
dtoc:   mov dx,0            dx=0         dx=0
         mov bx,10      bx=10          bx=10
         div bx         ax=1266,dx=6   ax=126,dx=6
         mov cx,ax      cx=1266      cx=126
         add dx,30h       dx=36h         dx=36h
         push dx          push 6         
         inc si         si=1
         jcxz dtoc_ok   cx=1266 ,cx不为0
         jmp short dtoc   跳回去
dtoc_ok:   mov cx,si      cx=1
         mov si,0         si=0
dtoc_s:    pop bx         bx=6          第二次:bx=6
         mov ds:,bl   data:0=6            data:1=6
         inc si         si=1                  si=2
         loop dtoc_s      执行后cx=0,跳回去   退出循环cx=0
         mov ds:,byte ptr 0      data:2和data:3的值无改变,为0
         ret            返回
   
show_str:mov al,160       al=160=a0h
         mul dh         ax=1280
         dec ax         ax=1279
         mov dx,ax      dx=1279
         mov al,2         al=2
         mul dl         ax=6
         dec ax         ax=5
         add ax,dx      ax=1284
         add ax,0b800h    ax=bd04h
         mov es,ax      es=bd04h
         mov bp,0         bp=0
         mov ch,0         ch=0
show_s:    mov cl,ds:   cl=data:0=6         第二次:cl=data:1=6    第三次:cl=data:2=0
         jcxz show_ok   cx=6                        cx=6                   cx=0 跳
         mov es:,cl   bd04:0=6,                  bd04:2=6
                           即第7行第2个               
                        从第0行第0个开始数
         mov es:,bl    bd04:1=6                  bd04:3=6
         inc si            si=1                        si=2
         add bp,2            bp=2                        bp=4
         jmp short show_s    跳                        跳
show_ok:   ret               返回
   
code ends
end start

z496032037 发表于 2012-7-1 00:55:38

jianqitao 发表于 2012-7-1 00:33 static/image/common/back.gif
编译时通过的,我帮你人肉单步跟踪调试了一下,错误挺多,自己看吧
assume cs:code,ds:data,ss:stack
dat ...

F:\dm

z496032037 发表于 2012-7-1 00:57:16

F:\dm\未命名.jpg

jianqitao 发表于 2012-7-1 01:22:18

之前的答案有错哦,我再帮你看一下
页: [1]
查看完整版本: 实验十 这个程序为什么不能再屏幕显示字符? 哪错了? 数据放入现存的地址不对吗?