汇编的一维数组问题

来源:百度知道 编辑:UC知道 时间:2024/05/26 23:36:19
把一维数组里面的数 安 奇偶 分开 以下是我编写的程序 帮帮查查错!!!

DATA SEGMENT
VARB DB 14,-25,56,-17,78
COUNT EQU $-VARB
Item DB 0
ODDNUM DB ?
EVENNUM DB ?
DATA ENDS

CODE SEGMENT
MAIN PROC FAR
ASSUME CS : CODE, DS : DATA
MOV AX, DATA
MOV DS, AX
XOR AX, AX
MOV CX, COUNT
BLOOP: MOV AX, VARB[Item]
CMP AX, 0
JL BNEG
JMP SHORT A
BNEG: NEG AX
A: AND AX, 00000001B
JP B
MOV ODD[Item] VARB[Item]
B: MOV EVENNUM[Item] VARB[Item]
INC Item
LOOP BLOOP
MOV AX, 4C00H
INT 21H
MAIN ENDP<

不是说了嘛,si要加中括号,用寄存器间接寻址方式
实在不行给你写个完整的

寻址方式错误啊
能够在中括号里出现的只能是BX、SI、DI、BP中的一个,怎么能出现item呢
比如用SI,一开始用“XOR SI,SI”对SI清零,LOOP前用“inc si”对si增1,
然后这三条指令都改成“varb[si]”

后两条指令的源操作数和目标操作数之间没有逗号啊!

另外,觉得你这个程序的问题还有很多呢!
XOR AX, AX
MOV CX, COUNT
BLOOP: MOV AX, VARB[Item] ;varb定义的是字节类型,一下取出一个字?

CMP AX, 0
JL BNEG
JMP SHORT A
BNEG: NEG AX
以上这一小段可以简化:
cmp ax,0
jnl a
neg ax
但是以上这一段是干什么用的?区分奇偶数还需要先取绝对值吗?
A: AND AX, 00000001B ;最好用test指令,同样影响标志位,但不改变ax的值
JP B ;最好用zf标志判断,也就是jz b
MOV ODD[Item] VARB[Item]
B: MOV EVENNUM[Item] VARB[Item]
以上这两句,语法错误有二:
一:就像前面说的,寻址方式错误
二:8086/8088的汇编语言不允许双操作数指令中两个操作数都是存储器操作数
INC Item
LOOP BLOOP
MOV AX, 4C00H
INT 21H

that's all

你的程序标点符号缺少或者弄成中文标点符号了