鱼C论坛

 找回密码
 立即注册
查看: 2694|回复: 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列显示出来




小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-3-31 13:47:52 | 显示全部楼层
本帖最后由 莫名其妙 于 2012-3-31 14:45 编辑

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

  1. start : mov ax,12666
  2. mov bx ,data
  3. mov ds,bx
  4. mov si,0
  5.                       mov bx,10
  6.                       mov dx,0
  7. call dtoc

  8. mov dh,8
  9. mov dl,2
  10. mov cl,2
  11. call show_str

  12. mov ax,4c00h
  13. int 21h
  14. dtoc:                              div bx;除10
  15. add dl,30H;余数加30H得字符
  16. mov ds:[si],dl;放入内存中
  17. inc si;自增1
  18. mov dx,0;清零
  19. mov cx,ax;为下步跳转检验
  20. jcxz ok
  21. jmp short dtoc;循环
  22. ok: mov ds:[si],al;加个结速符号0
  23. ret
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-3-31 15:13:21 | 显示全部楼层

没有除法益出,我是在CMD运行exe的时候益出的,但在调试的时候没有益出
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-3-31 16:13:32 | 显示全部楼层
楼主,代码用代码格式编辑下

你的代码复制过来有些问题!!!!!!
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-3-31 16:28:47 | 显示全部楼层
  1. assume cs:code

  2. data segment
  3. db 10 dup (0)
  4. data ends

  5. code segment
  6. start : mov ax,12666
  7.          mov bx ,data
  8.                  mov ds,bx
  9.                  mov si,0
  10.                  call dtoc
  11.                  
  12.                  mov dh,8
  13.                  mov dl,2
  14.                  mov cl,2
  15.                  call show_str
  16.                  
  17.                  mov ax,4c00h
  18.                  int 21h
  19.    
  20.     dtoc:mov cx,10         
  21.              div cx              ;除10
  22.                  add dl,30H     ;余数加30H得字符
  23.                  mov ds:[si],dl   ;放入内存中
  24.                  inc si       ;自增1
  25.                  mov dx,0      ;清零
  26.                  mov cx,ax      ;为下步跳转检验
  27.                  jcxz ok
  28.                  jmp short dtoc   ;循环
  29.          ok: mov ds:[si],al
  30.                  ret
  31.                  
  32. show_str:mov bp,0
  33.          mov bx,cx      ;cx放的是绿色用来显示出来
  34.          mov ax,0b800h    ;显存为置
  35.          mov es,ax      ;显存位置给ES
  36.                  mov ax,0       ;Ax清零
  37.          mov al,0A0h     ;显存一行80字符 a0相当于第二行起址位
  38.                  mul dh        ;*dh得第9行起址位
  39.          mov si,ax      ;第9行起址位给了SI
  40.                  mov ax,0      
  41.                  mov al,2       ;一列2个字节
  42.                  mul dl
  43.                  add si,ax      ;列+行起址位得到要真正要输入的位置
  44.                  mov di,0
  45.                  mov cx,0
  46.                  push cx       ;为pop的时候数到31H即1以后结束准备
  47.         to:         mov cl,ds:[di]    ;把ds:0地址内的数给CL 即第一个数36H
  48.                  jcxz go       ;判CX是否为零掉转
  49.                  push cx       ;放入栈
  50.                  inc di        ;di自增入next 36 >36>32>31>0 到0跳出
  51.                  jmp short to   ;循环
  52.         go:         pop cx      ;先入后出31>32>36?36>36>0
  53.              jcxz home    ;判断跳转
  54.                  mov es:[bp+si],cl   ;将CL的数据存入显存为址
  55.                  mov es:[bp+si+1],bl  ;将色填入去
  56.                  add bp,2        ;加二到下一个数填写位置
  57.                  jmp short go      ;循环
  58.     home:ret         
  59.                  
  60.    
  61. code ends
  62. end start                 
复制代码


小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-3-31 16:29:46 | 显示全部楼层
wAterLoo 发表于 2012-3-31 16:13
楼主,代码用代码格式编辑下

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

有问题可能那些解释
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-3-31 16:36:56 | 显示全部楼层
猪好大 发表于 2012-3-31 16:29
有问题可能那些解释

要不你干脆把注释去掉- - ,然后编译通过后再发上来
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-3-31 17:46:01 | 显示全部楼层
  1. assume cs:code

  2. data segment
  3. db 10 dup (0)
  4. data ends

  5. code segment
  6. start : mov ax,12666
  7.          mov bx ,data
  8.                  mov ds,bx
  9.                  mov si,0
  10.                  call dtoc
  11.                  
  12.                  mov dh,8
  13.                  mov dl,2
  14.                  mov cl,2
  15.                  call show_str
  16.                  
  17.                  mov ax,4c00h
  18.                  int 21h
  19.    
  20.     dtoc:mov cx,10
  21.              div cx            
  22.                  add dl,30H
  23.                  mov ds:[si],dl
  24.                  inc si
  25.                  mov dx,0
  26.                  mov cx,ax
  27.                  jcxz ok
  28.                  jmp short dtoc
  29.          ok: mov ds:[si],al
  30.                  ret
  31.                  
  32. show_str:mov bp,0
  33.          mov bx,cx
  34.          mov ax,0b800h
  35.          mov es,ax
  36.                  mov ax,0
  37.          mov al,0A0h
  38.                  mul dh
  39.          mov si,ax
  40.                  mov ax,0
  41.                  mov al,2
  42.                  mul dl
  43.                  add si,ax
  44.                  mov di,0
  45.                  mov cx,0
  46.                  push cx
  47.         to:         mov cl,ds:[di]
  48.                  jcxz go
  49.                  push cx
  50.                  inc di
  51.                  jmp short to
  52.         go:         pop cx
  53.              jcxz home
  54.                  mov es:[bp+si],cl
  55.                  mov es:[bp+si+1],bl
  56.                  add bp,2
  57.                  jmp short go
  58.     home:ret         
  59.                  
  60.    
  61. code ends
  62. end start
复制代码


小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-3-31 17:47:20 | 显示全部楼层
wAterLoo 发表于 2012-3-31 16:36
要不你干脆把注释去掉- - ,然后编译通过后再发上来

搞点了,编译通过了用debug调式没有发生everflow 量是在CMD运行就everflow了
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-3-31 18:17:05 | 显示全部楼层
猪好大 发表于 2012-3-31 17:47
搞点了,编译通过了用debug调式没有发生everflow 量是在CMD运行就everflow了

解说在程序里面

  1. assume cs:code

  2. data segment
  3. db 10 dup (0)
  4. data ends

  5. code segment
  6. start : ;xor dx,dx   
  7.                      mov ax,12666
  8.          mov bx ,data
  9.                  mov ds,bx
  10.                  mov si,0
  11.                  call dtoc
  12.                  
  13.                  mov dh,8
  14.                  mov dl,2
  15.                  mov cl,2
  16.                  call show_str
  17.                  
  18.                  mov ax,4c00h
  19.                  int 21h
  20.    
  21.     dtoc:;这里给你一个建议,尽量将用到的寄存器Push进栈,函数结束的时候再pop回来
  22.             xor dx,dx            ;清0,保证DH不受上一次影响,你想想如果你在调用dtoc的时候
  23.              mov cx,10            ;dx不为0会怎么样呢?本来你的数据12666 = 317AH
  24.                                              ;但是如果dx为FFFF,这时候你的操作就是
  25.                                              ;FFFF,317A / 10 = FFFF317 所以会产生溢出
  26.                                              ;由于debug模式的调试机制,会对寄存器默认初始为0
  27.                                              ;但是直接运行是不会的
  28.          div cx               ;你也可以把xor dx,dx 放到start:后面,你会发现程序也会正常运行      
  29.          add dl,30H            ;但是不推荐这样做,至于为什么你以后会懂得 - -
  30.          mov ds:[si],dl
  31.          inc si
  32.          mov dx,0
  33.          mov cx,ax
  34.          jcxz ok
  35.          jmp short dtoc
  36.          ok: mov ds:[si],al
  37.          ret
  38.                  
  39. show_str:mov bp,0
  40.          mov bx,cx
  41.          mov ax,0b800h
  42.          mov es,ax
  43.                  mov ax,0
  44.          mov al,0A0h
  45.                  mul dh
  46.          mov si,ax
  47.                  mov ax,0
  48.                  mov al,2
  49.                  mul dl
  50.                  add si,ax
  51.                  mov di,0
  52.                  mov cx,0
  53.                  push cx
  54.         to:         mov cl,ds:[di]
  55.                  jcxz go
  56.                  push cx
  57.                  inc di
  58.                  jmp short to
  59.         go:         pop cx
  60.              jcxz home
  61.                  mov es:[bp+si],cl
  62.                  mov es:[bp+si+1],bl
  63.                  add bp,2
  64.                  jmp short go
  65.     home:ret         
  66.                  
  67.    
  68. code ends
  69. end start
复制代码



小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-3-31 19:17:53 | 显示全部楼层
谢谢版主和莫名其妙,原来是DX置零,俺明白了谢谢解答
小甲鱼最新课程 -> https://ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-7-5 19:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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