注册 登录
编程论坛 汇编论坛

有关循环输入的问题!

syuanq 发布于 2006-12-21 11:20, 1083 次点击
请问怎样实现循环输入十个数,然后输出结果
13 回复
#2
lefttime2006-12-21 13:45
一个直接用字符形式输入
例如:
......
NUM DB 10 DUP(?)
......
MOV CX,10
MOV AH,1
LEA BX,NUM
NEXT0: INT 21H
MOV [BX],AL
LOOP NEXT0
MOV CX,10
NEXT1: LEA BX,NUM
MOV DL,[BX]
INT 21H
LOOP NEXT1
......

或者用字符串形式输入
例如:
......
NUM DB 11,0,12 DUP('$') ;注意这里的数值,原因估计大伙都知道啦,不清楚的话可以上机调试
......
MOV AH,10
LEA DX,NUM
INT 21H
MOV AH,9
LEA DX,NUM+2
INT 21H
......
#3
syuanq2006-12-21 16:54

谢谢啦

#4
syuanq2006-12-21 17:13
我是一个新手,二楼的我看得不是很明白,能否解释一下呢?谢谢
#5
lefttime2006-12-21 18:04
[QUOTE]一个直接用字符形式输入
例如:
......
NUM DB 10 DUP(?) ;这里是数据段中定义的一个存放空间
......
MOV CX,10 ;初始化输入的位数,用CX装载便于循环控制
MOV AH,1 ;初始化调用1号中断(字符输入)
LEA BX,NUM ;用基址寄存器来存放 存储数据的首地址
NEXT0: INT 21H ;DOS功能中断调用,开始输入
MOV [BX],AL ;输入的数即时传送至存放单元
LOOP NEXT0 ;未输入完10位数,继续循环输入
MOV CX,10 ;显示数据用的位数计数
NEXT1: LEA BX,NUM
MOV DL,[BX] ;1号中断输出的数存放在DL中,所以就有了这条指令
INT 21H ;DOS功能中断调用,开始输出
LOOP NEXT1 ;未输出完10位数,继续循环输出
......[/QUOTE]
[QUOTE]......
NUM DB 11,0,12 DUP('$') ;这里的11表示字符串输入时最多输入11个字符,因为包括回车符,所以
事实上只允许输入10个字符,0可以用任意数代替(当然得在0~255间),它
在10号中断时被即时刷新,它表示的是实际的输入个数(由系统自行计算);
而这里的12表示你开辟的空间,这里是用户自行指定,最好指定的数为不
小于第1个数;或者在这里可以直接写上12个 '$'
......
MOV AH,10 ;10号中断是用于输入字符串的,默认的段是DS:DX;也就是说在数据段中的,
以DX的值为偏移量的数据区存放输入的字符串
LEA DX,NUM ;LEA指令是取源操作数的有效地址(偏移量),即这里指定了存放地址
INT 21H
MOV AH,9 ;9号中断,用于输出字符串,同样指定段DS:DX
LEA DX,NUM+2
INT 21H
......[/QUOTE]
#6
syuanq2006-12-21 19:00
我把MOV [BX],AX 改为 MOV [DX],AX为什么不行呢?
#7
lefttime2006-12-21 19:09
因为[]中存放东东的有两种(当然变量除外):一个是立即数,一个是间接寄存器
而作为间接寄存器用的只有四个
BX(基址寄存器)、BP(基址指针寄存器)、SI(源变址寄存器)、DI(目的变址寄存器)
所以你用DX是不行的
#8
syuanq2006-12-21 19:21

有时候要用到寄存器的时候,但是却不知用哪个,请问 AX,BX,CX,DX,与 SP,BP,SI,DI 以及 CS,DS,SS,ES这个几个应该怎样区别?

#9
曾小2006-12-21 19:22
我有一个问题:怎么从键盘上输入一个二进制数?
系统默认的是十进制数,如果我输入一串由0和1组成的数是不是还得用
.radix来说明输入的是表示二进制?
类似的我要输入八进制,十六进制是不是都得这样来说明?
不知道我说清楚了不?
我就是不明白怎么把我们输入的数直接看成是二,八,十六进制.
#10
lefttime2006-12-21 19:30
我们输入的数都是以16进制,如果你想把输入的数直接看成是其它进制的话,我们可以通过建立对应的分支程序来调用输入,例如我可以建立一个宏或子程序(HEX_B、HEX_O、HEX_D,当然名字可以自己取)用于输入并即时转换成对应进制,这样就可以解决啦
#11
曾小2006-12-21 19:57
哦!这样啊!现在我还没学宏,以后在试试吧!先去做做子程序了.
谢谢你!!!




哎呀!现在我还是觉得迷糊:我们是输入一个一个的字符(当然可以转换成ASCII 码,看成是一个数),到底怎样从键盘上输入一个如:1234H 的数啊???? 

[此贴子已经被作者于2006-12-21 20:01:58编辑过]

#12
syuanq2006-12-21 20:18

DATA SEGMENT
TABLE DW 41H,58H,42H,50H,5AH,44H,55H,42H,'$'
LEN DW 16
DATA ENDS

CODE SEGMENT
ASSUME CS:CODE, DS:DATA

MAIN PROC FAR
PUSH DS
MOV AX,0
PUSH AX
MOV AX, DATA
MOV DS, AX

CALL FAR PTR DISP
MOV DL, 0DH ;DISPLAY THE NEW LINE
MOV AH, 2
INT 21H
MOV DL, 0AH
MOV AH, 2
INT 21H

LP1: MOV BX, 1 ;SET FLAG, IF 1, NOT FINISHED
MOV CX, LEN ;TIMES OF INTERATION
DEC CX
MOV SI, OFFSET TABLE

LP2: MOV AX, [SI]
CMP AX, [SI+2]
JBE NEXT
XCHG AX, [SI+2]
MOV [SI], AX
XOR BX, BX ;IF XCHG HAPPENS, SET BX TO 0

NEXT: ADD SI, 2
LOOP LP2
DEC LEN
CMP BX, 1
JNZ LP1
JMP SHORT EXIT

DISP: MOV DX, OFFSET TABLE
MOV AH, 9
INT 21H
RET

EXIT: CALL FAR PTR DISP
MOV AX, 4C00H
INT 21H
MAIN ENDP
CODE ENDS
END MAIN
程序是把字母输出并排序,但是运行时却有错误,请问错在哪里呢?

#13
lefttime2006-12-21 20:38

楼上的给出你的想法好么

#14
嘉行2006-12-23 15:52
先在数据段中给出定义,
然后用跳转,反复调用.
1