鱼C论坛

 找回密码
 立即注册
查看: 2352|回复: 5

课程设计1

[复制链接]
发表于 2014-12-1 10:36:41 | 显示全部楼层 |阅读模式
30鱼币
将两个数字转化成字符串并输出,代码如下:
assume cs:code

data segment
    dd 12345,1266688
data ends

stack segment
    dw 8 dup(?)
stack ends
code segment
start:
    mov ax,data
        mov ds,ax
        mov si,0
       
        mov ax,0b800h
        mov es,ax
        mov bp,12*160+20*2
        mov di,0
       
        mov ax,stack
        mov ss,ax
        mov sp,10h
       
        mov cx,2          ;两个数两次循环
s: push cx           ;将cx压栈;后面会用到cx寄存器
    call dtoc            ;调用函数,他会将数字转化成字符串显示出来
        pop cx
        add si,4
        loop s
       
    mov ax,4c00h
        int 21h

dtoc:
    mov ax,[si]
        mov dx,[si+2]             ;被除数

dt0:call divdw              ;调用divdw
    mov cx,ax               ;把低八位的商赋给cx,为零则跳转,不为零则继续执行
    jcxz dt1
        add bx,30h               ;转化成字符
        push bx                  ;将字符压入栈中压榨
        inc di                   ;记录压入栈的字符的个数
        mov cx,0ah              ;把除数赋给cx
        jmp short dt0
       
        mov cx,di                ;把压入栈的字符的个数赋给cx,即为循环次数
dt1:pop es:[bp]              ;把字符存放在显存段中
        mov byte ptr es:[bp+1],02h  ;设置显示字符为绿色
        add bp,2
        loop dt1
        ret
       
divdw:                             ;不会溢出的除法运算,将商的低八位保存在ax,高八位保存在dx,余数保存在bx中。借助王爽老师课本的公式。
    mov cx,dx                      ;将被除数的高八位赋给cx,为零则进行普通的除法运算
        jcxz divdw1
        mov cx,0ah
        push ax                        ;将ax压入栈
        mov ax,dx                      ;把被除数的高八位传给ax
        div cl                        
        mov bl,al                      ;把商给bl;之后会赋给dl,这就是高八位的商
        mov dl,ah                      ;把余数给dl,与ax组成新的被除数
        pop ax
        div word ptr cx               
        mov cx,dx                        ;把余数赋给cx
        mov dl,bl                       ;将高八位的商给bx
        mov bx,cx                       ;余数保存在bx中,因为cx之后还要用
        ret
divdw1:
    mov cx,0ah
    div cx
    mov bx,dx
        mov dx,0
    ret       
code ends
end start
直接运行出现divide overflow,单步调试到mov cx,dx就会出现下图的错误:
QQ截图20141201101505.png

在线等解答!!!

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-12-1 10:39:50 | 显示全部楼层
  1. assume cs:code

  2. data segment
  3.     dd 12345,1266688
  4. data ends

  5. stack segment
  6.     dw 8 dup(?)
  7. stack ends
  8. code segment
  9. start:
  10.     mov ax,data
  11.         mov ds,ax
  12.         mov si,0
  13.        
  14.         mov ax,0b800h
  15.         mov es,ax
  16.         mov bp,12*160+20*2
  17.         mov di,0
  18.        
  19.         mov ax,stack
  20.         mov ss,ax
  21.         mov sp,10h
  22.        
  23.         mov cx,2          ;两个数两次循环
  24. s: push cx           ;将cx压栈;后面会用到cx寄存器
  25.     call dtoc            ;调用函数,他会将数字转化成字符串显示出来
  26.         pop cx
  27.         add si,4
  28.         loop s
  29.        
  30.     mov ax,4c00h
  31.         int 21h

  32. dtoc:
  33.     mov ax,[si]
  34.         mov dx,[si+2]             ;被除数
  35.    
  36. dt0:call divdw              ;调用divdw
  37.     mov cx,ax               ;把低八位的商赋给cx,为零则跳转,不为零则继续执行
  38.     jcxz dt1
  39.         add bx,30h               ;转化成字符
  40.         push bx                  ;将字符压入栈中压榨
  41.         inc di                   ;记录压入栈的字符的个数
  42.         mov cx,0ah              ;把除数赋给cx
  43.         jmp short dt0
  44.        
  45.         mov cx,di                ;把压入栈的字符的个数赋给cx,即为循环次数
  46. dt1:pop es:[bp]              ;把字符存放在显存段中
  47.         mov byte ptr es:[bp+1],02h  ;设置显示字符为绿色
  48.         add bp,2
  49.         loop dt1
  50.         ret
  51.        
  52. divdw:                             ;不会溢出的除法运算,将商的低八位保存在ax,高八位保存在dx,余数保存在bx中。借助王爽老师课本的公式。
  53.     mov cx,dx                      ;将被除数的高八位赋给cx,为零则进行普通的除法运算
  54.         jcxz divdw1
  55.         mov cx,0ah
  56.         push ax                        ;将ax压入栈
  57.         mov ax,dx                      ;把被除数的高八位传给ax
  58.         div cl                        
  59.         mov bl,al                      ;把商给bl;之后会赋给dl,这就是高八位的商
  60.         mov dl,ah                      ;把余数给dl,与ax组成新的被除数
  61.         pop ax
  62.         div word ptr cx               
  63.         mov cx,dx                        ;把余数赋给cx
  64.         mov dl,bl                       ;将高八位的商给bx
  65.         mov bx,cx                       ;余数保存在bx中,因为cx之后还要用
  66.         ret
  67. divdw1:
  68.     mov cx,0ah
  69.     div cx
  70.     mov bx,dx
  71.         mov dx,0
  72.     ret       
  73. code ends
  74. end start
复制代码

代码重发一次,刚刚没看到这个功能。。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

头像被屏蔽
发表于 2014-12-2 19:59:13 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-12-4 20:10:03 | 显示全部楼层

然后呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2015-2-16 13:07:11 | 显示全部楼层
我也是差点鱼比:mad:
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2015-2-28 01:51:04 | 显示全部楼层
你的代码我试了下,有一处错误,编译不过,提示在65行处
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-3 08:14

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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