猪好大 发表于 2012-3-31 12:33:34

10.3实验题求解

本帖最后由 猪好大 于 2012-3-31 19:18 编辑

assume cs:code

data segment
db 10 dup (0)
data ends

code segment
start : mov ax,12666
         mov bx ,data
               mov ds,bx
               mov si,0
               call dtoc
               
               mov dh,8
               mov dl,2
               mov cl,2
               call show_str
               
               mov ax,4c00h
               int 21h

    dtoc:mov cx,10         
             div cx            ;除10
               add dl,30H     ;余数加30H得字符
               mov ds:,dl   ;放入内存中
               inc si       ;自增1
               mov dx,0      ;清零
               mov cx,ax      ;为下步跳转检验
               jcxz ok
               jmp short dtoc   ;循环
         ok: mov ds:,al    ;加个结速符号0
               ret
               
show_str:mov bp,0
         mov bx,cx      ;cx放的是绿色用来显示出来
         mov ax,0b800h    ;显存为置
         mov es,ax      ;显存位置给ES
               mov ax,0       ;Ax清零
         mov al,0A0h     ;显存一行80字符 a0相当于第二行起址位
               mul dh        ;*dh得第9行起址位
         mov si,ax      ;第9行起址位给了SI
               mov ax,0      
               mov al,2       ;一列2个字节
               mul dl
               add si,ax      ;列+行起址位得到要真正要输入的位置
               mov di,0
               mov cx,0
               push cx       ;为pop的时候数到31H即1以后结束准备
      to:         mov cl,ds:    ;把ds:0地址内的数给CL 即第一个数36H
               jcxz go       ;判CX是否为零掉转
               push cx       ;放入栈
               inc di        ;di自增入next 36 >36>32>31>0 到0跳出
               jmp short to   ;循环
      go:         pop cx      ;先入后出31>32>36?36>36>0
             jcxz home    ;判断跳转
               mov es:,cl   ;将CL的数据存入显存为址
               mov es:,bl  ;将色填入去
               add bp,2        ;加二到下一个数填写位置
               jmp short go      ;循环
    home:ret         
               

code ends
end start               

程序在debug里面没有益出但在外边exe的时候overflow
求高手解答一下和指出那地方出错了  实验目的是将12666数字求出字符 1 2 6 6 6 并将其用绿色在9行3列显示出来




莫名其妙 发表于 2012-3-31 13:47:52

本帖最后由 莫名其妙 于 2012-3-31 14:45 编辑

是除法溢出么?稍微改了几个地方 就是不规则的突出的地方

start : mov ax,12666
mov bx ,data
mov ds,bx
mov si,0
                      mov bx,10
                      mov dx,0
call dtoc

mov dh,8
mov dl,2
mov cl,2
call show_str

mov ax,4c00h
int 21h
dtoc:                              div bx;除10
add dl,30H;余数加30H得字符
mov ds:,dl;放入内存中
inc si;自增1
mov dx,0;清零
mov cx,ax;为下步跳转检验
jcxz ok
jmp short dtoc;循环
ok: mov ds:,al;加个结速符号0
ret

猪好大 发表于 2012-3-31 15:13:21

莫名其妙 发表于 2012-3-31 13:47 static/image/common/back.gif
是除法溢出么?稍微改了几个地方 就是不规则的突出的地方

没有除法益出,我是在CMD运行exe的时候益出的,但在调试的时候没有益出

wAterLoo 发表于 2012-3-31 16:13:32

楼主,代码用代码格式编辑下

你的代码复制过来有些问题!!!!!!

猪好大 发表于 2012-3-31 16:28:47

assume cs:code

data segment
db 10 dup (0)
data ends

code segment
start : mov ax,12666
         mov bx ,data
               mov ds,bx
               mov si,0
               call dtoc
               
               mov dh,8
               mov dl,2
               mov cl,2
               call show_str
               
               mov ax,4c00h
               int 21h
   
    dtoc:mov cx,10         
             div cx            ;除10
               add dl,30H     ;余数加30H得字符
               mov ds:,dl   ;放入内存中
               inc si       ;自增1
               mov dx,0      ;清零
               mov cx,ax      ;为下步跳转检验
               jcxz ok
               jmp short dtoc   ;循环
       ok: mov ds:,al
               ret
               
show_str:mov bp,0
         mov bx,cx      ;cx放的是绿色用来显示出来
         mov ax,0b800h    ;显存为置
         mov es,ax      ;显存位置给ES
               mov ax,0       ;Ax清零
         mov al,0A0h     ;显存一行80字符 a0相当于第二行起址位
               mul dh        ;*dh得第9行起址位
         mov si,ax      ;第9行起址位给了SI
               mov ax,0      
               mov al,2       ;一列2个字节
               mul dl
               add si,ax      ;列+行起址位得到要真正要输入的位置
               mov di,0
               mov cx,0
               push cx       ;为pop的时候数到31H即1以后结束准备
        to:       mov cl,ds:    ;把ds:0地址内的数给CL 即第一个数36H
               jcxz go       ;判CX是否为零掉转
               push cx       ;放入栈
               inc di        ;di自增入next 36 >36>32>31>0 到0跳出
               jmp short to   ;循环
        go:       pop cx      ;先入后出31>32>36?36>36>0
             jcxz home    ;判断跳转
               mov es:,cl   ;将CL的数据存入显存为址
               mov es:,bl  ;将色填入去
               add bp,2        ;加二到下一个数填写位置
               jmp short go      ;循环
    home:ret       
               
   
code ends
end start               

猪好大 发表于 2012-3-31 16:29:46

wAterLoo 发表于 2012-3-31 16:13 static/image/common/back.gif
楼主,代码用代码格式编辑下

你的代码复制过来有些问题!!!!!!

有问题可能那些解释

wAterLoo 发表于 2012-3-31 16:36:56

猪好大 发表于 2012-3-31 16:29 static/image/common/back.gif
有问题可能那些解释

要不你干脆把注释去掉- - ,然后编译通过后再发上来

猪好大 发表于 2012-3-31 17:46:01

assume cs:code

data segment
db 10 dup (0)
data ends

code segment
start : mov ax,12666
         mov bx ,data
               mov ds,bx
               mov si,0
               call dtoc
               
               mov dh,8
               mov dl,2
               mov cl,2
               call show_str
               
               mov ax,4c00h
               int 21h
   
    dtoc:mov cx,10
             div cx            
               add dl,30H
               mov ds:,dl
               inc si
               mov dx,0
               mov cx,ax
               jcxz ok
               jmp short dtoc
       ok: mov ds:,al
               ret
               
show_str:mov bp,0
         mov bx,cx
         mov ax,0b800h
         mov es,ax
               mov ax,0
         mov al,0A0h
               mul dh
         mov si,ax
               mov ax,0
               mov al,2
               mul dl
               add si,ax
               mov di,0
               mov cx,0
               push cx
        to:       mov cl,ds:
               jcxz go
               push cx
               inc di
               jmp short to
        go:       pop cx
             jcxz home
               mov es:,cl
               mov es:,bl
               add bp,2
               jmp short go
    home:ret       
               
   
code ends
end start

猪好大 发表于 2012-3-31 17:47:20

wAterLoo 发表于 2012-3-31 16:36 static/image/common/back.gif
要不你干脆把注释去掉- - ,然后编译通过后再发上来

搞点了,编译通过了用debug调式没有发生everflow 量是在CMD运行就everflow了

wAterLoo 发表于 2012-3-31 18:17:05

猪好大 发表于 2012-3-31 17:47 static/image/common/back.gif
搞点了,编译通过了用debug调式没有发生everflow 量是在CMD运行就everflow了

解说在程序里面

assume cs:code

data segment
db 10 dup (0)
data ends

code segment
start : ;xor dx,dx   
                     mov ax,12666
         mov bx ,data
               mov ds,bx
               mov si,0
               call dtoc
               
               mov dh,8
               mov dl,2
               mov cl,2
               call show_str
               
               mov ax,4c00h
               int 21h
   
    dtoc:;这里给你一个建议,尽量将用到的寄存器Push进栈,函数结束的时候再pop回来
            xor dx,dx            ;清0,保证DH不受上一次影响,你想想如果你在调用dtoc的时候
             mov cx,10            ;dx不为0会怎么样呢?本来你的数据12666 = 317AH
                                             ;但是如果dx为FFFF,这时候你的操作就是
                                             ;FFFF,317A / 10 = FFFF317 所以会产生溢出
                                             ;由于debug模式的调试机制,会对寄存器默认初始为0
                                             ;但是直接运行是不会的
         div cx               ;你也可以把xor dx,dx 放到start:后面,你会发现程序也会正常运行      
         add dl,30H            ;但是不推荐这样做,至于为什么你以后会懂得 - -
         mov ds:,dl
         inc si
         mov dx,0
         mov cx,ax
         jcxz ok
         jmp short dtoc
         ok: mov ds:,al
         ret
               
show_str:mov bp,0
         mov bx,cx
         mov ax,0b800h
         mov es,ax
               mov ax,0
         mov al,0A0h
               mul dh
         mov si,ax
               mov ax,0
               mov al,2
               mul dl
               add si,ax
               mov di,0
               mov cx,0
               push cx
      to:         mov cl,ds:
               jcxz go
               push cx
               inc di
               jmp short to
      go:         pop cx
             jcxz home
               mov es:,cl
               mov es:,bl
               add bp,2
               jmp short go
    home:ret         
               
   
code ends
end start



猪好大 发表于 2012-3-31 19:17:53

谢谢版主和莫名其妙,原来是DX置零,俺明白了谢谢解答
页: [1]
查看完整版本: 10.3实验题求解