汇编语言小程序,急!题目要求键盘输入一个数字,然后乘以4倍,然后输出,我运行程序后,输入3-9都得不到结果
DATASEGMENTSTR1DB'PLEASEENTER:',0AH,0DH,'$'STR2DB0AH,0DH,'ENTERERROR!',0AH,0DH,'$'DAT...
DATA SEGMENT
STR1 DB 'PLEASE ENTER:',0AH,0DH,'$'
STR2 DB 0AH,0DH,'ENTER ERROR!',0AH,0DH,'$'
DATA ENDS
CODE SEGMENT
ASSUME DS:DATA,CS:CODE
START:
MOV AX,DATA
MOV DS,AX
AGAIN:
MOV AH,09H
LEA DX,STR1
INT 21H ;输入提示
MOV AH,01H
INT 21H ;输入
CMP AL,'0'
JB FALSE ;筛选数字
CMP AL,'9'
JA FALSE
JMP NOFALSE
FALSE:
MOV AH,09H
LEA DX,STR2
INT 21H
JMP AGAIN ;处理错误输入,并且要求用户重新输入
NOFALSE:
SUB AL,30H ;从ASCII转化为数字
SHL AL,1
SHL AL,1
XOR AH,AH ;把准备存放余数的AH清零
MOV CL,10H
DIV CL ;分解数字
MOV CL,AH ;为输出做准备
MOV AH,02H ;输出部分
MOV DL,0AH
INT 21H
MOV DL,0DH
INT 21H ;换行
ADD AL,30H
MOV DL,AL
INT 21H ;先输出AL里的商
ADD CL,30H
MOV DL,CL
INT 21H ;再输出AH存入BL里的余数
MOV AH,4CH
INT 21H
CODE ENDS
END START
在线等啊!
貌似是除那里出错了,不应该用16进制,即MOV CL,10H改成MOV CL,10
但是这个程序在我一个同学(相同系统,相同位数,编译器相同),但是帮我编译出来的EXE是OK的,但是我的还是错的! 展开
STR1 DB 'PLEASE ENTER:',0AH,0DH,'$'
STR2 DB 0AH,0DH,'ENTER ERROR!',0AH,0DH,'$'
DATA ENDS
CODE SEGMENT
ASSUME DS:DATA,CS:CODE
START:
MOV AX,DATA
MOV DS,AX
AGAIN:
MOV AH,09H
LEA DX,STR1
INT 21H ;输入提示
MOV AH,01H
INT 21H ;输入
CMP AL,'0'
JB FALSE ;筛选数字
CMP AL,'9'
JA FALSE
JMP NOFALSE
FALSE:
MOV AH,09H
LEA DX,STR2
INT 21H
JMP AGAIN ;处理错误输入,并且要求用户重新输入
NOFALSE:
SUB AL,30H ;从ASCII转化为数字
SHL AL,1
SHL AL,1
XOR AH,AH ;把准备存放余数的AH清零
MOV CL,10H
DIV CL ;分解数字
MOV CL,AH ;为输出做准备
MOV AH,02H ;输出部分
MOV DL,0AH
INT 21H
MOV DL,0DH
INT 21H ;换行
ADD AL,30H
MOV DL,AL
INT 21H ;先输出AL里的商
ADD CL,30H
MOV DL,CL
INT 21H ;再输出AH存入BL里的余数
MOV AH,4CH
INT 21H
CODE ENDS
END START
在线等啊!
貌似是除那里出错了,不应该用16进制,即MOV CL,10H改成MOV CL,10
但是这个程序在我一个同学(相同系统,相同位数,编译器相同),但是帮我编译出来的EXE是OK的,但是我的还是错的! 展开
3个回答
展开全部
DATA SEGMENT
STR1 DB 'PLEASE ENTER:',0AH,0DH,'$'
STR2 DB 0AH,0DH,'ENTER ERROR!',0AH,0DH,'$'
DATA ENDS
CODE SEGMENT
ASSUME DS:DATA,CS:CODE
START:
MOV AX,DATA
MOV DS,AX
AGAIN:
MOV AH,09H
LEA DX,STR1
INT 21H ;输入提示
MOV AH,01H
INT 21H ;输入
CMP AL,'0'
JB FALSE ;筛选数字
CMP AL,'9'
JA FALSE
JMP NOFALSE
FALSE:
MOV AH,09H
LEA DX,STR2
INT 21H
JMP AGAIN ;处理错误输入,并且要求用户重新输入
NOFALSE:
SUB AL,30H ;从ASCII转化为数字
SHL AL,1
SHL AL,1
XOR AH,AH ;把准备存放余数的AH清零
MOV CL,10 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DIV CL ;分解数字
MOV CX,AX ;;;;;;;;;;;;;;
; MOV CL,AH ;为输出做准备
MOV AH,02H ;输出部分
MOV DL,0AH
INT 21H
MOV DL,0DH
INT 21H ;换行
ADD CL,30H
MOV DL,CL
INT 21H ;先输出AL里的商
ADD CH,30H
MOV DL,CH
INT 21H ;再输出AH存入BL里的余数
MOV AH,4CH
INT 21H
CODE ENDS
END START
展开全部
首先说一个错误的地方,DOS2号功能的调用会破坏AL寄存器的内容,因此
ADD AL,30H
MOV DL,AL
INT 21H ;先输出AL里的商
不会有输出
然后,如果你输入的是3,乘4就是12,DIV指令后余数12就放到AH里,你把它传给CL再输出,0CH+30H=3CH,已经不是数字的ASCII码,你这个输出是不是有点问题,或者说你不是要在屏幕上显示12么
ADD AL,30H
MOV DL,AL
INT 21H ;先输出AL里的商
不会有输出
然后,如果你输入的是3,乘4就是12,DIV指令后余数12就放到AH里,你把它传给CL再输出,0CH+30H=3CH,已经不是数字的ASCII码,你这个输出是不是有点问题,或者说你不是要在屏幕上显示12么
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
XOR AH, AH ;把准备存放余数的AH清零
MOV CL, 10
DIV CL ;分解数字
ADD AX, 3030H
MOV CX, AX ;为输出做准备
MOV AH, 02H ;输出部分
MOV DL, 0AH
INT 21H
MOV DL, 0DH
INT 21H ;换行
MOV DL, CL
INT 21H ;先输出AL里的商
MOV DL, CH
INT 21H ;再输出AH里的余数
MOV CL, 10
DIV CL ;分解数字
ADD AX, 3030H
MOV CX, AX ;为输出做准备
MOV AH, 02H ;输出部分
MOV DL, 0AH
INT 21H
MOV DL, 0DH
INT 21H ;换行
MOV DL, CL
INT 21H ;先输出AL里的商
MOV DL, CH
INT 21H ;再输出AH里的余数
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询