鱼C论坛

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

实验十 终于独立完成,对小甲鱼的答案有点疑惑

[复制链接]
发表于 2011-8-16 23:22:34 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 javanetwork 于 2011-8-17 13:27 编辑
assume cs:myc,ds:mydat
mydat segment
db 128 dup(0)
dw 123,12666,41,8,3,38
mydat ends

mystack segment
dw 8 dup(0)
mystack ends
myc segment
start:
  mov ax,mystack
  mov ss,ax
  mov sp,10H
  mov ax,mydat
  mov ds,ax
  
  
  mov si,128
  mov di,si

  mov cx,6
  call getword 


  mov ax,4c00H;程序出口
  int 21h
  
getword:
;从ds:[si]处获取字型整数,输出到屏幕
;参数:cx为欲获取的数据的个数
  push cx
  push si
  push di
  
  mov al,ds:[si]
  mov ah,ds:[si+1]
  
  call wtoa


  push ax
  push dx
  mov dl,12;设置相同的行和列,前一个字符串被覆盖
  mov cl,01101101B
  mov ax,mydat
  mov ds,ax
  mov si,di
  call show_str
  pop dx
  pop ax
  
  
  
  pop di
  pop si
  add si,2
  pop cx
  loop getword
  
  
  ret  
  
  
  
wtoa:  
;将字型整数以十进制输出;调用divw,不断divw 10取余
;参数:ax存放整数
;结果:字符串在ds:[di]这个内存地址前面

  sub di,1
  mov cl,0
  mov ds:[di],cl;置字符串尾为\0
rea:
  mov cx,ax
  jcxz zero;如果ax已经为零了,返回
  mov cl,10
  call divw
  add cl,48;数字转换成字符
  dec di
  mov byte ptr ds:[di],cl;从后往前
  loop rea
  
  
zero:  
  
  ret  
  
  
  
  
  
  
  
  
  
divw:  
;进行不会溢出的除法运算 16位除8位
;参数:ax被除数,cl除数
;返回:al结果的低8位,ah结果的高8位,cl余数
;如0973H除2
;ah  al  cl  ch
;09  73  02  73
;00  09  02  73
;01  04   02  73
;   dl
;01  73  02  73
;01  B9  02  73
;01  B9  01  73
;ex:
;  mov ax,9473H
;  mov cl,14H
;  call divw
  mov ch,al ;暂时保存al的值
  mov al,ah
  mov ah,0
  div cl  ;00dx /cx 0009/2
  mov dl,al  ;保存低8位的结果
  mov al,ch;恢复al的值
  div cl  ;173/2
  mov cl,ah
  mov ah,dl
  ret
  
  
  
  
  
  
  
  
  
  
  
    
show_str:  ;显示字符串
;参数:dl行0~24  dh列0~79  cl颜色  ds:[si]字符串的首地址
;应用示例:
;  mov dl,12
;  mov dh,40
;  mov cl,01101101B
;  mov ax,mydat
;  mov ds,ax
;  mov si,0
;  call show_str
  mov bx,0B800H
  mov es,bx
  
  mov ax,0A0H
  mul dl
  mov bx,ax
  mov ax,02H
  mul dh
  add bx,ax
  mov dl,cl
cir:  
  
  mov ch,0
  mov cl,ds:[si]
  jcxz ou
  mov es:[bx],cl
  mov es:[bx+1],dl
  inc si
  add bx,2
  jmp short cir
ou:
  ret
  
  




  
divdw:  
;进行不会溢出的除法运算,32位除16位
;参数:ax为低16位,dx为高16位,cx除数
;返回:ax结果的低16位,dx结果的高16位,cx余数
;如0973H除2
;dx  ax  cx  bx
;09  73  02  73
;00  09  02  73
;01  04   02  73
;push ax
;01  73  02  73
;01  B9  02  73
;01  B9  01  73
;应用示例:
;  mov ax,9473H
;  mov dx,0187H
;  mov cx,3142H
;  call divdw
  mov bx,ax ;暂时保存ax的值
  mov ax,dx
  mov dx,0
  div cx  ;00dx /cx 0009/2
  push ax  ;保存低16位的结果
  mov ax,bx;恢复ax的值
  div cx  ;173/2
  mov cx,dx
  pop dx
  ret  
  
myc ends;结束段
end start;结束程序,同时告诉编译器,程序入口的标号是start    
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-8-17 03:26:45 | 显示全部楼层
小甲鱼视频里面 实验十第三个子程序有没有问题?
余数保存他用push dx
但是show_str处理的是字节型数据,且遇到零就终止了
还有里面用div指令,没有防止数据溢出
题目要求转换好几个数据,他直接取了一个,偷工减料啊

以上个人看法,欢迎指正。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-8-17 07:32:44 | 显示全部楼层
大家交流交流!:lol
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-8-17 13:56:39 | 显示全部楼层
我来学习下啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-10-8 22:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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