鱼C论坛

 找回密码
 立即注册
查看: 2069|回复: 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

在线等解答!!!

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-12-1 10:39:50 | 显示全部楼层
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
代码重发一次,刚刚没看到这个功能。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

头像被屏蔽
发表于 2014-12-2 19:59:13 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

然后呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-2-16 13:07:11 | 显示全部楼层
我也是差点鱼比:mad:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-2-28 01:51:04 | 显示全部楼层
你的代码我试了下,有一处错误,编译不过,提示在65行处
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-18 20:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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