鱼C论坛

 找回密码
 立即注册
查看: 2760|回复: 3

[已解决]望大神指点

[复制链接]
发表于 2019-3-18 10:53:50 | 显示全部楼层 |阅读模式

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

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

x
  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,3
  14.                         mov cl,2
  15.                         call show_str
  16.                         mov ax,4c00h
  17.                         int 21h
  18.                        
  19.         dtoc:        mov bx,10
  20.                         inc si
  21.                 s:        div bx
  22.                         add dl,30h
  23.                         mov ds:[si],dl
  24.                         mov dx,0
  25.                         inc ax
  26.                         mov cx,ax
  27.                         dec ax
  28.                         jcxz s1
  29.                         inc si
  30.                         loop s
  31.                 s1:        ret
  32.                
  33. show_str:        dec si
  34.                         mov bl,dh
  35.                         mov dh,0
  36.                         add dl,dl
  37.                         mov di,dx
  38.                         mov dx,0
  39.                         mov bh,0
  40.                         mov ax,160
  41.                         mul bx
  42.                         add ax,160
  43.                         mov bx,ax
  44.                         mov ax,0b800h
  45.                         mov es,ax
  46.                         mov ch,0
  47.                         mov dx,cx
  48.                 s8:        mov al,ds:[si]
  49.                         mov es:[bx+di],al
  50.                         mov es:[bx+di+1],dl
  51.                         mov cl,ds:[si]
  52.                         mov ch,0
  53.                         dec si
  54.                         add di,2
  55.                         jcxz s10
  56.                         jmp s8
  57.                 s10:ret       
  58.                                
  59.                        
  60. code ends
  61. end start
复制代码

为什么我单步执行可以,直接运行会报错,显示除法溢出呢
最佳答案
2019-3-18 12:23:34
   试试我修改的代码:
  1. data segment
  2.         db 010h dup (0)
  3. data ends

  4. stack segment stack
  5.         dw 080h dup (0)
  6. stack ends

  7. code segment
  8.         assume cs:code , ds:data , ss:stack
  9. main proc near
  10.                         mov ax,12666
  11.                         mov bx,data
  12.                         mov ds,bx
  13.                         mov si,0
  14.                         call dtoc
  15.                         
  16.                         mov dh,8          ; 第8行
  17.                         mov dl,3          ; 第3列
  18.                         mov cl,2          ; 字符颜色:绿色
  19.                         call show_str
  20.                         
  21.                         xor ax,ax
  22.                         int 016h

  23.                         mov ax,4c00h
  24.                         int 21h
  25. main endp
  26. Align 010h
  27. dtoc proc near
  28.                         mov bx,10
  29.                 s:      cwd
  30.                         div bx
  31.                         add dl,30h
  32.                         mov ds:[si],dl
  33.                         or ax,ax
  34.                         jz s1
  35.                         inc si
  36.                         jmp s
  37.                 s1:     ret
  38. dtoc endp
  39. Align 10h
  40. show_str proc near
  41.                         mov ax,0b800h
  42.                         mov es,ax
  43.                         xor bx,bx
  44.                         mov bl,dh
  45.                         dec bx
  46.                         xor dh,dh
  47.                         add dx,dx
  48.                         mov di,dx
  49.                         mov ax,160
  50.                         mul bx
  51.                         add di,ax
  52.                 s8:     mov al,ds:[si]
  53.                         or al,al
  54.                         jz s10
  55.                         stosb
  56.                         mov al,cl
  57.                         stosb
  58.                         dec si
  59.                         jmp s8
  60.                 s10:    ret
  61. show_str endp        
  62. code ends
  63. end main
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-3-18 12:23:34 | 显示全部楼层    本楼为最佳答案   
   试试我修改的代码:
  1. data segment
  2.         db 010h dup (0)
  3. data ends

  4. stack segment stack
  5.         dw 080h dup (0)
  6. stack ends

  7. code segment
  8.         assume cs:code , ds:data , ss:stack
  9. main proc near
  10.                         mov ax,12666
  11.                         mov bx,data
  12.                         mov ds,bx
  13.                         mov si,0
  14.                         call dtoc
  15.                         
  16.                         mov dh,8          ; 第8行
  17.                         mov dl,3          ; 第3列
  18.                         mov cl,2          ; 字符颜色:绿色
  19.                         call show_str
  20.                         
  21.                         xor ax,ax
  22.                         int 016h

  23.                         mov ax,4c00h
  24.                         int 21h
  25. main endp
  26. Align 010h
  27. dtoc proc near
  28.                         mov bx,10
  29.                 s:      cwd
  30.                         div bx
  31.                         add dl,30h
  32.                         mov ds:[si],dl
  33.                         or ax,ax
  34.                         jz s1
  35.                         inc si
  36.                         jmp s
  37.                 s1:     ret
  38. dtoc endp
  39. Align 10h
  40. show_str proc near
  41.                         mov ax,0b800h
  42.                         mov es,ax
  43.                         xor bx,bx
  44.                         mov bl,dh
  45.                         dec bx
  46.                         xor dh,dh
  47.                         add dx,dx
  48.                         mov di,dx
  49.                         mov ax,160
  50.                         mul bx
  51.                         add di,ax
  52.                 s8:     mov al,ds:[si]
  53.                         or al,al
  54.                         jz s10
  55.                         stosb
  56.                         mov al,cl
  57.                         stosb
  58.                         dec si
  59.                         jmp s8
  60.                 s10:    ret
  61. show_str endp        
  62. code ends
  63. end main
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-3-19 14:39:26 | 显示全部楼层
jackz007 发表于 2019-3-18 12:23
试试我修改的代码:

谢谢,刚刚我看了你给我的代码运行是不会报错的。后面我又重新查了下我的,是除法前dx没有初始化造成的。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-19 15:18:13 | 显示全部楼层
独孤王道 发表于 2019-3-19 14:39
谢谢,刚刚我看了你给我的代码运行是不会报错的。后面我又重新查了下我的,是除法前dx没有初始化造成的。 ...

     做16位除法的时候,如果没有特别用到 dx 就一定要把它置为 0 值,这是特别容易被忽视和出问题的地方。
     你的代码首次执行 div 指令的时候,没有始化 dx,但是,进入循环以后就有了。  
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-6-9 23:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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