api 发表于 2011-11-27 20:38:07

实验10.3帮忙看下

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 ,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:
         jcxz ok
         mov es:,cl
         mov es:,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,计算出来的数字就不对了.

api 发表于 2011-11-27 20:53:30

我这个问题不对,但小鱼老师视频上说的也不对,他说在程序员不知道数据的值是多少的情况,不能确定循环次数,如果数据的值超过16位,程序员肯定要把16位以上的数据值放入dx中,就是说程序员是一定要知道数据值的.不知道我说的对不对

kane080824 发表于 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除法溢出的解决

api 发表于 2011-11-28 21:41:11

kane080824 发表于 2011-11-28 20:21 static/image/common/back.gif
1,小甲鱼老师有时候是会口误,但口误不是原则原理上的错,所以首先是你理解错了,有时候循环知道次数,有时候不 ...

有空再继续研究,真是头疼
页: [1]
查看完整版本: 实验10.3帮忙看下