找回密码
 注册
搜索
热搜: 回贴
  • 前程无忧官网首页 有什么好的平台可以
  • 最新的销售平台 互联网营销的平台有哪
  • 制作网页的基本流程 网页制作和网页设
  • 【帝国CMS】输出带序号的列表(数字排
  • 网站建设公司 三一,中联,极东泵车的
  • 织梦 建站 织梦网站模版后台怎么更改
  • 云服务官网 哪些网站有免费的简历模板
  • 如何建网站要什么条件 建网站要用什么
  • 吉林市移动公司电话 吉林省退休人员网
  • 设计类毕业论文 网站设计与实现毕业论
查看: 297|回复: 8

一个把输入的16制数转换成二进制数,并输出的问题

[复制链接]
发表于 2009-12-3 13:34:06 | 显示全部楼层 |阅读模式 IP:江苏扬州
DATAS SEGMENT
DATA1 db 'inputerorr','$'
DATA2 DB 16 dup(?),'$'
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
LEA DI,DATA2
MOV CX,4
MOV BL,00H
L1:MOV AH,01
INT 21H
CMP AL,30H
JA L2
JMP L
L2:CMP AL,39H
JNA L4
CMP AL,41H
JA L3
JMP L
L3:CMP AL,46
JNA2 L5
L:LEA DX,DATA1
MOV AH,9
INT 21H
L4:SUB AL,30H
JMP L6
L5:SUB AL,37H
L6:PUSH CX
MOV CL,4
SHL AL,CL
MOV CX,4
SHL AL,1
ADC BL,30H
MOV [DI],BL
INC DI
LOOP L6
POP CX
LOOP L1
LEA DX,DATA2
MOV AH,9
INT 21H
MOV AH,4CH
INT 21H
CODES ENDS
END START
程序执行后一输入字符,DOS界面就退出了,路过次地的高手帮小弟一把,谢谢了
发表于 2009-12-3 13:34:11 | 显示全部楼层 IP:江苏扬州
上面程序在L处结束没有退出,这样还会继续进行以下程序,导致在L6处不断循环,所以一输字符DOS界面就退了。下面的程序可用

stack segment stack 'stack'
stack ends
data segment
DATA1 DB 'inputerorr','$'
DATA2 DB 16 dup(?),'$'
data ends
code segment
start proc far
assume ss:stack,cs:code,ds:data
push ds
sub ax,ax
push ax
mov ax,data
mov ds,ax
LEA DI,DATA2
MOV CX,4
MOV BL,00H
L1: MOV AH,1
INT 21H
CMP AL,30H
JNB L2 ;AL>=30H
JMP L
L2: CMP AL,39H
JNA L4 ;AL<=39H
CMP AL,41H
JNB L3 ;AL>=41H
JMP L
L3: CMP AL,46H
JNA L5 ;AL<=46H
L: LEA DX,DATA1
MOV AH,9
INT 21H
JMP OT
L4: SUB AL,30H
JMP L7
L5: SUB AL,37H
L7: SHL AL,CL
L6: MOV BL,0
RCL AL,1
RCL BL,1
ADD BL,30H
MOV [DI],BL
INC DI
LOOP L6
MOV DL,0AH
MOV AH,2
INT 21H

LEA DX,DATA2
MOV AH,9
INT 21H
MOV AH,4CH
INT 21H

OT: ret
start endp
code ends
end start
回复

使用道具 举报

发表于 2009-12-3 13:34:14 | 显示全部楼层 IP:江苏扬州
非常感谢....
不过还有一点不明白,如果我输入的是正确的16进制数的话,程序根本不会经过L,而且就算L不退出我也实在看不出为什么要死循环?????
回复

使用道具 举报

发表于 2009-12-3 13:34:18 | 显示全部楼层 IP:江苏扬州
您在开头加的 push ds
sub ax,ax
push ax
不懂是什么意思>>>>
回复

使用道具 举报

发表于 2009-12-3 13:34:22 | 显示全部楼层 IP:江苏扬州
以下是引用cabin0120在2007-11-16 18:08:22的发言:

您在开头加的 push ds
sub ax,ax
push ax
不懂是什么意思>>>>
这是将DS的内容和0作为段地址和偏移地址入栈,以便在程序结束时用RET指令返回DOS,这是一种较好的工作方式。如果在主程序开始时没有用这三条指令在堆栈中建立返回信息,则在程序结束时就不能直接用RET指令,而应使用:
MOV AX,4C00H
INT 21H
指令返回。
回复

使用道具 举报

发表于 2009-12-3 13:34:26 | 显示全部楼层 IP:江苏扬州
以下是引用zhulei1978在2007-11-16 20:00:26的发言:


这是将DS的内容和0作为段地址和偏移地址入栈,以便在程序结束时用RET指令返回DOS,这是一种较好的工作方式。如果在主程序开始时没有用这三条指令在堆栈中建立返回信息,则在程序结束时就不能直接用RET指令,而应使用:
MOV AX,4C00H
INT 21H
指令返回。
学习了,不过能不能再解释下,为什么这样比较好呢,用中断退出有什么不好的地方

还有,一开始ds不是还没赋值data的段地址,这个时候的ds保存的是什么,code的段地址吗?
回复

使用道具 举报

发表于 2009-12-3 13:34:30 | 显示全部楼层 IP:江苏扬州
还是这个程序,我稍微改了一下,能调试出来,
第一个程序在第二程序的基础上加了红色部分,目的是想连续输入几个16进制数,但是在输入第二数时就出现了乱码,请教一下斑竹这是为什么???


一...................
DATAS SEGMENT
DATA1 db 'inputerorr','$' ;此处输入数据段代码 ]
DATA2 DB 16 dup(?),'$'
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
LEA DI,DATA2 ;此处输入代码段代码

MOV BL,4
L8:MOV CX,4
L1:MOV AH,01
INT 21H
CMP AL,30H
JA L2
JMP L
L2:CMP AL,39H
JNA L4
CMP AL,41H
JA L3
JMP L
L3:CMP AL,46
JNA L5
L:LEA DX,DATA1
MOV AH,9
INT 21H
JMP L1
L4:SUB AL,30H
JMP L6
L5:SUB AL,37H

L6: SHL AL,CL

L7: SHL AL,1

MOV BL,00H
RCL BL,1
ADC BL,30H
MOV [DI],BL
INC DI
LOOP L7


DEC BL
JNZ L8

MOV DL,0AH
MOV AH,2
INT 21H

LEA DX,DATA2
MOV AH,9
INT 21H

MOV AH,4CH
INT 21H
CODES ENDS
END START



二..................

DATAS SEGMENT
DATA1 db 'inputerorr','$' ;此处输入数据段代码 ]
DATA2 DB 16 dup(?),'$'
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
LEA DI,DATA2 ;此处输入代码段代码
MOV CX,4


L1:MOV AH,01
INT 21H
CMP AL,30H
JA L2
JMP L
L2:CMP AL,39H
JNA L4
CMP AL,41H
JA L3
JMP L
L3:CMP AL,46
JNA L5
L:LEA DX,DATA1
MOV AH,9
INT 21H
JMP L1
L4:SUB AL,30H
JMP L6
L5:SUB AL,37H

L6: SHL AL,CL

L7: SHL AL,1

MOV BL,00H
RCL BL,1
ADC BL,30H
MOV [DI],BL
INC DI
LOOP L7




MOV DL,0AH
MOV AH,2
INT 21H

LEA DX,DATA2
MOV AH,9
INT 21H

MOV AH,4CH
INT 21H
CODES ENDS
END START
回复

使用道具 举报

发表于 2009-12-3 13:34:34 | 显示全部楼层 IP:江苏扬州
我写的程序:
DATA SEGMENT
BJZF DW 'B'
COUNT EQU 16

DATA ENDS
STACK SEGMENT PARA STACK 'STACK'
KJ DB 100 DUP (?)
TOP EQU $
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START: MOV AX,DATA
MOV DS,AX
MOV AX,STACK
MOV SS,AX
MOV SP,TOP
MOV BX,BJZF
MOV DI,8000H
MOV CX,COUNT
MOV AH,02H
MOV SI,0
GO: CMP SI,4
JNZ GO1
MOV SI,0
MOV DL,3
INT 21H
GO1: TEST BX,DI
JZ J0
MOV DL,1
ADD DL,30H
INT 21H
SHR DI,1
INC SI
LOOP GO
JMP EN
J0: MOV DL,0
ADD DL,30H
INT 21H
SHR DI,1
INC SI
LOOP GO
EN: MOV AH,4CH
INT 21H
CODE ENDS
END START
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|小黑屋|最新主题|手机版|微赢网络技术论坛 ( 苏ICP备08020429号 )

GMT+8, 2024-9-29 13:32 , Processed in 0.274964 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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