中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
作者:
标题: 汇编语言编译器使用5 上一主题 | 下一主题
chrise
初级用户





积分 88
发帖 32
注册 2010-3-27
状态 离线
『楼 主』:  汇编语言编译器使用5

题目是 从键盘输入二位非压缩的BCD数,存入AX中中,并将其转化为二进制数,且显示出来
     NAME EX_05_18
STACKS SEGMENT
   DB 100 DUP(0)
STACKS ENDS

CSAG SEGMENT
    ASSUME CS:CSAG,SS:STACKS
MAIN PROC FAR
START:PUSH DS
      MOV AX,0
      PUSH AX
REV:MOV AH,1
  INT 21H
  MOV BL,AL
  INT 21H
  MOV AH,AL
  MOV AL,BL
  CMP AX,3030H;判AX中是否为'00'
   JE ENDTRAN
   CALL NEAR PTR TRAN
   CALL FAR PTR CON
   MOV AL,0DH;?
   CALL FAR PTR DISP
   MOV AL,0AH;?
   CALL FAR PTR DISP
   JMP REV
ENDTRAN:RET
MAIN ENDP
TRAN PROC NEAR
     AND AX,0F0FH
     MOV BL,AL
     MOV CL,3
     SHL AL,CL
     MOV CL,1
     SHL BL,CL
     ADD AL,BL
    ADD AL,AH;将两位BCD数转为二进制数
     RET
TRAN ENDP
CSAG ENDS
CSBG SEGMENT PARA'CODE'
         ASSUME CS:CSBG
CON PROC FAR
        PUSH AX
         MOV CL,4
         SHR AL,CL
         ADD AL,30H
         CMP AL,39H
         JBE CON2
         ADD AL,07H
CON2:PUSH AX
     MOV AL,0DH
     CALL FAR PTR DISP
     MOV AL,0AH
     CALL FAR PTR DISP
     POP AX
     CALL FAR PTR DISP;显示高位十六进制数
     POP AX
     AND AL,0FH
     ADD AL,30H
     CMP AL,39H
     JBE CON1
     ADD AL,07H
CON1:CALL FAR PTR DISP
      RET
CON ENDP
DISP PROC PAR     MOV DL,AL
     MOV AL,02H
     INT 21H
     RET
DISP ENDP
MOV AH,4CH
INT 21H
CSBG ENDS
     END START
      麻烦指教一下,有以下问题     
(1)判断输入的是不是00,为什么是CMP AX,3030H,为什么跟3030比较?
(2)上次请教过MOV DL,0DH   MOV AH,02H  INT21H  是换行功能。MOV DL,0AH  MOV AL,02H  INT 21H  是什么功能?
(3)子程序 TRAN 是将ASSCII码转换为二进制数的功能,帮忙看一下算法有没有问题?
(4)编译后有错误:ADD AL,AH
DISP PROC FAR
谢了

[ Last edited by chrise on 2010-4-11 at 22:34 ]

2010-4-11 21:57
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
本是
银牌会员





积分 2201
发帖 789
注册 2005-1-27
状态 离线
『第 2 楼』:  

MOV AH,4CH
INT 21H
此程序段不起作用!即没有被执行。

"ADD AL,AH;将两位BCD数转为二进制数"改;为;
——即全角字符改半角!

"DISP PROC PAR     MOV DL,AL"断作两行并改PAR为FAR如
DISP PROC FAR
     MOV DL,AL

(1)因为字符“0”的16进制码值为30h

(2)MOV DL,0AH  MOV AL,02H  INT 21H  是什么功能?
首先要改正mov al,02h为mov AH,02h,再说功能是它是回车

兄弟,你的输入出错太多,会浪费很多时间的,一定要看着书上的内容仔细核对源程序,特别要注意分清数字与字符(如0与o或O、1与l、6与b、9与q)、全角与半角(如;与;、,与,、“”与""、‘’与'')、保留字-自定义字-未定义字(FAR-PAR)的差别,尤其不要输错寄存器,如果是VGA显示器编程,有可能会烧掉显示器硬件的!

[ Last edited by 本是 on 2010-4-12 at 11:40 ]



my major is english----my love is dos----my teacher is the buddha----my friends--how about U
2010-4-12 11:38
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
chrise
初级用户





积分 88
发帖 32
注册 2010-3-27
状态 离线
『第 3 楼』:  再请教一下

什么是十六进制码啊?有键盘输入的数字都是十六进制码吗?

2010-4-12 20:39
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
chrise
初级用户





积分 88
发帖 32
注册 2010-3-27
状态 离线
『第 4 楼』:  stack 段

STACK段有一句
DB 100 DUP (0)
100指的是什么
堆栈操作不是字操作吗?这句活有什么作用?谢谢

2010-4-12 21:32
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
070
高级用户

苏醒的沉睡者


积分 659
发帖 217
注册 2003-2-15
来自 福建
状态 离线
『第 5 楼』:  



  Quote:
Originally posted by chrise at 2010-4-12 20:39:
什么是十六进制码啊?有键盘输入的数字都是十六进制码吗?

十六进制解释
http://baike.baidu.com/view/230306.html?wtp=tt

在汇编里,数字末尾带H或h的 是十六进制码。


------------------------善用搜索引擎解决明确具体的问题。

  Quote:
Originally posted by chrise at 2010-4-12 21:32:
STACK段有一句
DB 100 DUP (0)
100指的是什么
堆栈操作不是字操作吗?这句活有什么作用?谢谢

堆栈也是可以字节操作的
DB是定义字节单元 DUP是重复初值 100 是次数 后面(0)为赋值的初值

指令的作用是,在堆栈中申请100个字节的空间,每个字节赋值为0

作用就叫本是来回答吧,哈。我不会



好久没碰Dos,手都生了,赶紧回来练练.嘿嘿
2010-4-12 22:33
查看资料  发送邮件  发短消息 网志  OICQ (181315400)  编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: