急急急急急急!汇编编程(找水仙花数):invalid instruction operands是什么错误

DATASSEGMENT;此处输入数据段代码IN1DB13,10,'Thenumberis:',13,10,'$'NDW100A1DB0;百位数字除后余数A2DB0;十位... DATAS SEGMENT
;此处输入数据段代码
IN1 DB 13,10,'The number is :',13,10,'$'
N DW 100
A1 DB 0;百位数字除后余数
A2 DB 0;十位数字除后余数
B1 DW 0;百位立方之和
B2 DW 0;十位立方之和
B3 DW 0;个位立方之和
SUM DW 0 ;各位立方之和
M DB 0;显示时的中间变量
DATAS ENDS

STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS

CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
;此处输入代码段代码
MOV CX,900
;求百位数
L1: XOR AX,AX
MOV AX,N
MOV BL,100
DIV BL;AL->商(百位数),AH->余数
MOV A1,AH
MOV DL,AL
;百位数做立方运算
MUL AL
MUL DL
MOV B1,AX
;求十位数
MOV AL,A1
MOV AH,0
MOV BL,10
DIV BL;AL->商(十位数),AH->余数(个位数)
;求十位数的立方
MOV A2,AH
MOV DL,AL
MUL AL
MUL DL
MOV B2,AX
;求个位数的立方
MOV AL,A2
MOV DL,AL
MUL AL
MUL DL
MOV B3,AX
ADD DX,B1
ADD DX,B2
ADD DX,B3
MOV SUM,DX
CMP N,SUM;;;;;;;;;;;;;;;;;;;;;;;;这行有错误,求大神指点!!!!并帮忙看一下能否运行,万分感谢!!
JZ L2
INC N
LOOP L1

L2: LEA DI,IN1
MOV AH,09H
INT 21H
;百位显示
MOV AX,SUM
MOV BL,100
DIV BL
MOV M,AH
ADD AL,30H
MOV DL,AL
MOV AH,02H
INT 21H
;十位显示
MOV AL,M
MOV BL,10
DIV BL
ADD AL,30H
MOV DL,AL
MOV AH,02H
INT 21H
;个位数显示
ADD AH,30H
MOV DL,AH
MOV AH,02H
INT 21H

MOV AH,4CH
INT 21H
CODES ENDS
END START
展开
 我来答
做而论道
高能答主

2013-11-25 · 把复杂的事情简单说给你听
知道大有可为答主
回答量:3万
采纳率:80%
帮助的人:1.2亿
展开全部
DATAS SEGMENT
IN1 DB 13,10,'The number is : $'
A1 DB 0 ;百位数
A2 DB 0 ;十位数
A3 DB 0 ;个位数
B1 DW 0 ;百位立方
B2 DW 0 ;十位立方
B3 DW 0 ;个位立方
DATAS ENDS

CODES SEGMENT
ASSUME CS:CODES,DS:DATAS
START:
MOV AX, DATAS
MOV DS, AX

MOV CX, 999
L1:
MOV AX, CX
MOV BL, 100
DIV BL ;AL=百位数, AH=余数
MOV A1, AL ;百位
MOV AL, AH
MOV AH, 0
MOV BL, 10
DIV BL
MOV A2, AL ;十位
MOV A3, AH ;个位

CALL LIFANG ;求各个立方

MOV AX, B1
ADD AX, B2
ADD AX, B3
CMP AX, CX
JNE NEXT
CALL PRINT ;相等则显示
NEXT:
LOOP L1 ;循环到0为止

MOV AH, 4CH
INT 21H
;------------------------------
LIFANG:
MOV AL, A1
MOV AH, 0
MOV BX, AX
MUL BX
MUL BX
MOV B1, AX

MOV AL, A2
MOV AH, 0
MOV BX, AX
MUL BX
MUL BX
MOV B2, AX

MOV AL, A3
MOV AH, 0
MOV BX, AX
MUL BX
MUL BX
MOV B3, AX

RET
;------------------------------
PRINT:
LEA DX, IN1
MOV AH, 9
INT 21H
MOV AH, 2
MOV DL, A1 ;百
ADD DL, 30H
INT 21H
MOV DL, A2 ;十
ADD DL, 30H
INT 21H
MOV DL, A3 ;个
ADD DL, 30H
INT 21H
RET
;------------------------------
CODES ENDS
END START

执行后显示:

c:\masm510>XX

The number is : 407
The number is : 371
The number is : 370
The number is : 153
The number is : 001
c:\masm510>
清河大侠
推荐于2018-04-06 · TA获得超过1.3万个赞
知道大有可为答主
回答量:1.6万
采纳率:73%
帮助的人:1205万
展开全部
采用的是8086的指令集吧?你可以查看下CMP的定义,它有以下几种格式:

CMP REG, memory
CMP memory, REG
CMP REG, REG
CMP memory, immediate
CMP REG, immediate

可以看出,没有对两个内存变量进行比较的格式。而你的N和SUM都是内存变量。

解决办法,把N或者SUM先MOV到一个寄存器中,然后再进行比较。
追问
按照知友你的方法改了,程序运行没有出现错误,可是运行结果出现乱码,应该怎么改呢~?
追答
汇编阅读很辛苦。你可否把运行的情况截图看看?

考虑一下思路:显示的内容如果前面正常,后面有乱码,通常是字符串没有正常结尾。你可以查阅显示的中断服务程序的相关资料。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式