鱼C论坛

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

实验10.3帮忙看下

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

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

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

x
  1. assume cs:code,ss:stack
  2. stack segment
  3. db 10 dup (0)
  4. stack ends

  5. code segment
  6. start:mov ax,12666
  7.        mov bx,stack
  8.            mov ds,bx
  9.            mov si,0
  10.            call dtoc
  11.           
  12.            mov dh,8
  13.            mov dl,3
  14.            mov cl,2
  15.            call show_str
  16.            mov ax,4c00h
  17.            int 21h
  18.           
  19. dtoc:    push dx
  20.          push cx
  21.          push ax
  22.                  push si
  23.          push bx
  24.                  mov bx,0
  25.         s0:         mov cx,10
  26.          mov dx,0 ;除之前把dx置为0什么意思?
  27.          div cx
  28.                  mov cx,ax
  29.                  jcxz s1
  30.                  add dx,30h
  31.                  push dx
  32.                  inc bx
  33.                  jmp short s0
  34.         s1:  add dx,30h
  35.          push dx
  36.          inc bx
  37.          mov cx,bx
  38.          mov si,0
  39.     s2:  pop ax
  40.          mov [si],al
  41.          inc si
  42.          loop s2
  43.     ay:  pop bx
  44.          pop si
  45.          pop ax
  46.          pop cx
  47.          pop dx                 
  48.          ret                 
  49.           
  50. show_str:push bx
  51.          push cx
  52.          push si
  53.          mov al,0a0h
  54.          dec dh
  55.          mul dh
  56.          mov bx,ax
  57.          mov al,2
  58.          mul dl
  59.          sub ax,2
  60.          add bx,ax
  61.          mov ax,0b800h
  62.          mov es,ax
  63.          mov di,0
  64.          mov al,cl
  65.          mov ch,0
  66.      s3: mov cl,ds:[si]
  67.          jcxz ok
  68.          mov es:[bx+di],cl
  69.          mov es:[bx+di+1],al
  70.          inc si
  71.          add di,2
  72.          jmp short s3
  73.     ok:  pop si
  74.          pop cx
  75.          pop bx
  76.          ret                 
  77.       code ends
  78.           end start
复制代码
上面我做有标号那里,dx存放的是高16位数据,为什么在做32位除法前要把dx置为0,我把12666改为0FFFFFFFFH,计算出来的数字就不对了.
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2011-11-27 20:53:30 | 显示全部楼层
我这个问题不对,但小鱼老师视频上说的也不对,他说在程序员不知道数据的值是多少的情况,不能确定循环次数,如果数据的值超过16位,程序员肯定要把16位以上的数据值放入dx中,就是说程序员是一定要知道数据值的.不知道我说的对不对
小甲鱼最新课程 -> https://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除法溢出的解决
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2011-11-28 21:41:11 | 显示全部楼层

有空再继续研究,真是头疼
小甲鱼最新课程 -> https://ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-7-4 09:10

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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