鱼C论坛

 找回密码
 立即注册
查看: 1776|回复: 4

实验10.3

[复制链接]
发表于 2014-6-25 10:17:41 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 HTT_音乐 于 2014-6-25 10:18 编辑
assume cs:code

data segment
        db 30H, 31H, 32H, 33H, 34H, 35H, 36H, 0
        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, 3
        mov cl, 2
        call show_str

        mov ax, 4C00H
        int 21H

        ; 名称:dtoc
        ; 功能:将word型数据转变为表示十进制数的字符串,字符串以0位结尾符
        ; 参数:(ax)=wrod型数据
        ;                ds:si指向字符串的首地址
        ; 返回:无
        ; 应用举例:编程,将数据12666以十进制的形式在屏幕的8行3列,用绿色显示出来。
dtoc:
        push ax
        push dx
        push cx
        push si

s1:        mov cx, 10
        call divdw
        add cl, 30H
        mov ds:[si], cl
        inc si

        mov cx, ax
        add cx, dx
        jcxz short ok1

        jmp s1

ok1:mov ds:[si], cl
        pop si
        pop cx
        pop dx
        pop ax
        ret

        ; 名称:divdw
        ; 功能:进行不会产生溢出的除法运算,被除数为dword型,除数为word型,结果为dword型
        ; 参数:(ax)=dword型数据的低16位
        ;                (dx)=dword型数据的高16位
        ;                (cx)=除数
        ; 返回:(dx)=结果的高16位,(ax)=结果的低16位
        ;                (cx)=余数
        ; 应用举例:计算 1000000/10(F4240H/0AH)
divdw:
        push ax                        ; 把低16位数据存入栈空间
        mov ax, dx                ; 把高16位数据放入ax寄存器
        mov dx, 0                ; 把高16位寄存器dx置为0
        div cx                        ; 除数cx是16位,所以被除数为32位,dx为高位,ax为低位
                                        ; 由于高16位放入低16位,所以得到的商时高16位的数据
                                        ; 除法规则余数必定小于除数,所以高位的余数会被除掉

        mov bx, ax                ; 把高16位数据的商存入bx寄存器
        pop ax                        ; 取出栈空间的低16数据置入低16位
        div cx                        ; 高16位的余数和低16位的数一起相除
        mov cx, dx                ; 把高16位获得的余数赋给cx(余数必定小于除数)
        mov dx, bx                ; 把存入bx中的高16位的商还给高16位dx

        ret

        ; 名称:show_str
        ; 在指定的位置,用指定的颜色,显示一个用0结束的字符串。
        ; (dh)=行号(取值范围0~24),(dl)=列号(取值范围0~79)
        ; (cl)=颜色,ds:si制定字符串的首地址
        ; 返回:无
        ; 应用举例:在屏幕的8行2列,用绿色显示data段中的字符串
show_str:
        push ax                                ; 保存子程序中用到的寄存器
        push bx
        push cx
        push dx
        push es
        push si

        mov ax, 0B800H                ; 显存区开始地址
        mov es, ax
        
        mov al, 160                        ; 计算在显存区的打印位置
        mul dh
        mov si, ax
        mov al, 2
        mul dl
        add si, ax

        mov al, cl                        ; 复制显存区的颜色

        mov bx, 0
        mov ch, 0
s:        mov cl, ds:[bx]
        jcxz short ok
        mov es:[si], cl                ; 偶数位置存储ASCII编码
        mov es:[si+1], al        ; 奇数位置存储颜色
        inc bx
        add si, 2
        jmp s

ok:        pop si                                ; 按顺序释放保存的寄存器
        pop es
        pop dx
        pop cx
        pop bx
        pop ax
        ret
code ends

end start
2014-06-25 10:15:17 的屏幕截图.png
我自己写的代码,debug查看内存中的数据是 66621.(倒序排列的勿怪)。可是最后为什么在显存中会显示不正确呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-6-25 15:50:52 | 显示全部楼层

回帖奖励 +1 鱼币

帮你啾啾            
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-6-25 15:58:37 | 显示全部楼层
  呵呵,我找出来了,你粗心了, 22222.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-6-26 10:11:26 | 显示全部楼层

真是太感谢了,真的是这里的问题啊!!(就这一个我弄了两天,最后还是没好:dizzy:)
不过为什么我单步调试debug的时候是好的呢?执行就明显不对了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-6-26 11:04:33 | 显示全部楼层
HTT_音乐 发表于 2014-6-26 10:11
真是太感谢了,真的是这里的问题啊!!(就这一个我弄了两天,最后还是没好)
不过为什么我单步调 ...

debug调试我没试过,等下有时间帮你看下。你单步调试结果截图来看看。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-29 14:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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