鱼C论坛

 找回密码
 立即注册
查看: 2377|回复: 10

10.3实验题求解

[复制链接]
发表于 2012-3-31 12:33:34 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 猪好大 于 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:[si],dl   ;放入内存中
                 inc si       ;自增1
                 mov dx,0      ;清零
                 mov cx,ax      ;为下步跳转检验
                 jcxz ok
                 jmp short dtoc   ;循环
         ok: mov ds:[si],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:[di]    ;把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:[bp+si],cl   ;将CL的数据存入显存为址
                 mov es:[bp+si+1],bl  ;将色填入去
                 add bp,2        ;加二到下一个数填写位置
                 jmp short go      ;循环
    home:ret         
                 

code ends
end start                 

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




想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 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:[si],dl;放入内存中
inc si;自增1
mov dx,0;清零
mov cx,ax;为下步跳转检验
jcxz ok
jmp short dtoc;循环
ok: mov ds:[si],al;加个结速符号0
ret
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2012-3-31 15:13:21 | 显示全部楼层

没有除法益出,我是在CMD运行exe的时候益出的,但在调试的时候没有益出
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-3-31 16:13:32 | 显示全部楼层
楼主,代码用代码格式编辑下

你的代码复制过来有些问题!!!!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 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:[si],dl   ;放入内存中
                 inc si       ;自增1
                 mov dx,0      ;清零
                 mov cx,ax      ;为下步跳转检验
                 jcxz ok
                 jmp short dtoc   ;循环
         ok: mov ds:[si],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:[di]    ;把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:[bp+si],cl   ;将CL的数据存入显存为址
                 mov es:[bp+si+1],bl  ;将色填入去
                 add bp,2        ;加二到下一个数填写位置
                 jmp short go      ;循环
    home:ret         
                 
   
code ends
end start                 

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2012-3-31 16:29:46 | 显示全部楼层
wAterLoo 发表于 2012-3-31 16:13
楼主,代码用代码格式编辑下

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

有问题可能那些解释
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-3-31 16:36:56 | 显示全部楼层
猪好大 发表于 2012-3-31 16:29
有问题可能那些解释

要不你干脆把注释去掉- - ,然后编译通过后再发上来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 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:[si],dl
                 inc si
                 mov dx,0
                 mov cx,ax
                 jcxz ok
                 jmp short dtoc
         ok: mov ds:[si],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:[di]
                 jcxz go
                 push cx
                 inc di
                 jmp short to
        go:         pop cx
             jcxz home
                 mov es:[bp+si],cl
                 mov es:[bp+si+1],bl
                 add bp,2
                 jmp short go
    home:ret         
                 
   
code ends
end start

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2012-3-31 17:47:20 | 显示全部楼层
wAterLoo 发表于 2012-3-31 16:36
要不你干脆把注释去掉- - ,然后编译通过后再发上来

搞点了,编译通过了用debug调式没有发生everflow 量是在CMD运行就everflow了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-3-31 18:17:05 | 显示全部楼层
猪好大 发表于 2012-3-31 17:47
搞点了,编译通过了用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:[si],dl
         inc si
         mov dx,0
         mov cx,ax
         jcxz ok
         jmp short dtoc
         ok: mov ds:[si],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:[di]
                 jcxz go
                 push cx
                 inc di
                 jmp short to
        go:         pop cx
             jcxz home
                 mov es:[bp+si],cl
                 mov es:[bp+si+1],bl
                 add bp,2
                 jmp short go
    home:ret         
                 
   
code ends
end start


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2012-3-31 19:17:53 | 显示全部楼层
谢谢版主和莫名其妙,原来是DX置零,俺明白了谢谢解答
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-8 10:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表