汇编高手进来!!!!!

来源:百度知道 编辑:UC知道 时间:2024/05/15 18:04:28
遇到一个简单数组问题,菜鸟的我难解决,希望指点一下!
;=============================习题第3章21题
;=============================功能:内存自AREA1单元开始连续存放了10个已经排好序的无符号字型数据,
;=============================要求去掉相同的数据,只保留一个就可以,并存放到以AREA2为起始地址的
;=============================单元中,并显示出来。
;=============================作者:Alen 2006.11.17
STACKSG SEGMENT STACK 'S'
DW 32 DUP(?)
STACKSG ENDS

DATA SEGMENT
AREA1 DB 1,2,3,3,4,5,5,6,7,7
AREA2 DB 10 DUP(?),'$'
DATA ENDS

CODE SEGMENT
ASSUME CS:CODE ,DS:DATA,SS:STACKSG
START:
MOV AX,DATA
MOV DS,AX

;把AREA1中的数据显示一边
;XOR AREA1,30H
;LEA DX,AREA1
;MOV AH,9
;INT 21H
;INC AREA1

;*****************************************************************************
MOV DL,0DH ;回车
MOV AH,2
INT 21H

MOV DL,0AH ;换行
MOV AH,2
INT 21H

;循环10次进行查找和输出,SI和DI都放AREA1的偏移地址,BX放AREA2的偏移

写完了才发现楼上的已经给解了,我看了楼上的,你说的也有点小问题,你指出的楼主的第一点错误是不存在的,并且你的程序没有显示数字的功能,
(1)xor area1,30h 把BCD码转换成ASCII码是要用来输出的,楼主在程序里写的很清,只不过他用错了,这样做只能输出第一个字的ASCII码,要想输出所有,要用循环。
下面是我写的程序,运行后可在界面上看到结果,我运行过了,基本正确,因为用到输出字符,有点麻烦,没加注释。不太好理解,明白算法就行了
stacksg segment stack 's'
sta db 32 dup(?)
stacksg ends
datas segment
area1 db 1,2,3,3,4,5,5,6,7,7,'$'
area2 db 10 dup(0),'$'
datas ends
code segment 'code'
assume cs:code,ds:datas,ss:stacksg
start:mov ax,datas
mov ds,ax
mov cx,10
lea bx,area1
dis:mov dl,[bx]
inc bx
add dl,30h
mov ah,2
int 21h
loop dis
mov dl,13
mov ah,02
int 21h
mov dl,10
mov ah,02
int 21h
mov cx,10
lea bx,area1
lea si,area2
again:mov al,[bx]
jz over
inc bx
cmp al,[bx]