鱼C论坛

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

实验10.3帮忙看下

[复制链接]
发表于 2011-11-27 20:38:07 | 显示全部楼层 |阅读模式

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

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

x
assume cs:code,ss:stack
stack segment
db 10 dup (0)
stack ends

code segment
 start:mov ax,12666
       mov bx,stack
           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:    push dx
         push cx
         push ax
                 push si
         push bx
                 mov bx,0
        s0:         mov cx,10
         mov dx,0 ;除之前把dx置为0什么意思?
         div cx
                 mov cx,ax
                 jcxz s1
                 add dx,30h
                 push dx
                 inc bx
                 jmp short s0
        s1:  add dx,30h
         push dx
         inc bx
         mov cx,bx
         mov si,0
    s2:  pop ax
         mov [si],al
         inc si
         loop s2
    ay:  pop bx
         pop si
         pop ax
         pop cx
         pop dx                 
         ret                 
           
show_str:push bx
         push cx
         push si
         mov al,0a0h
         dec dh
         mul dh
         mov bx,ax
         mov al,2
         mul dl
         sub ax,2
         add bx,ax
         mov ax,0b800h
         mov es,ax
         mov di,0
         mov al,cl
         mov ch,0
     s3: mov cl,ds:[si]
         jcxz ok
         mov es:[bx+di],cl
         mov es:[bx+di+1],al
         inc si
         add di,2
         jmp short s3
    ok:  pop si
         pop cx
         pop bx
         ret                 
      code ends
          end start
上面我做有标号那里,dx存放的是高16位数据,为什么在做32位除法前要把dx置为0,我把12666改为0FFFFFFFFH,计算出来的数字就不对了.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-11-27 20:53:30 | 显示全部楼层
我这个问题不对,但小鱼老师视频上说的也不对,他说在程序员不知道数据的值是多少的情况,不能确定循环次数,如果数据的值超过16位,程序员肯定要把16位以上的数据值放入dx中,就是说程序员是一定要知道数据值的.不知道我说的对不对
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-11-28 20:21:39 | 显示全部楼层
本帖最后由 kane080824 于 2011-11-28 20:23 编辑

1,小甲鱼老师有时候是会口误,但口误不是原则原理上的错,所以首先是你理解错了,有时候循环知道次数,有时候不知道具体次数,一般知道循环次数可以用loop转移指令,不知道次数就用jcxz或其它一些判断+跳转来实现,因为虽然不知道循环的次数,但知道终止循环的条件
2,dx为什么置0?因为div cx是除数为16位,所以被除数要为32位,高16位在dx中,此程序中被除数大小不超过16位表示范围,所以dx要复位归0
3,你把12666改成0FFFFFFFFH,无非想验证此程序可以显示更大的十进制数,但遗憾的是这个程序的除法有缺陷,因为还没有考虑到除法溢出的可能,而你这个数很大,第一次除以10后的商ax已无法存放产生溢出,所以结果必然不对,请你仔细看实验10.2除法溢出的解决
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-11-28 21:41:11 | 显示全部楼层

有空再继续研究,真是头疼
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-11-19 12:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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