Новичок
Регистрация: 17.03.2011
Сообщений: 10
Репутация: 0
|
ассемблер. удаление элемента массива (помогите найти ошибку) СРОЧНО,ДО ЗАВТРА!!
задание заключается в удалении элемента массива. размер массива,элементы,удаляемый элемент вводятся с клавиатуры. кучу раз уже переписывала код по новой, привожу самый нормальный вариант (который работает совсем не так как надо). до конца ввода вроде нет ошибок,проверяла. насколько я могу предположить,ошибка кроется где-то начиная с проверки элементов на удаление вплоть до вывода. подскажите пожалуйста,что нужно исправить,завтра уже нужно сдавать рабочую программу. а,и ещё.бесконечные циклы в конце сделаны чтобы окно не закрывалось после завершения программы,но это почему то не всегда срабатывает.есть ли какое-нибудь прерывание для таких целей?
http://zalil.ru/32355197
Код:
.model tiny
.code
org 100h
start:
mov ah,9h
mov dx,offset text1
int 21h ;вывод сообщения
mov ah,1h
int 21h ;считывание символа
call perevod ;преобразуем код в символ
mov dx,10h
mul dx ;умножаем на 10
mov dx,ax
mov ah,1h
int 21h ;считываем символ
call perevod ;преобразуем код в символ
add ax,dx
mov razmer,ax ;записываем в переменную
mov kol,0h ;обнуляем счётчик
mov bx,offset massiv ;адрес начала списка
mov adres,bx
mov ah,9h
mov dx,offset text2
int 21h ;вывод сообщения
vvod:
mov ah,1h
int 21h ;ввод символа
mov ah,0h
mov bx,adres
mov [bx],al ;записываем считанный символ в список
add bx,2h
mov adres,bx ;увеличиваем адрес на 2 байта
mov bx,kol
add bx,1h ;увеличиваем количество итераций
mov kol,bx
mov cx,razmer
cmp bx,cx
jl vvod ;если введены не все элементы,вводим
mov ah,9h
mov dx,offset text3
int 21h ;вывод сообщения
mov ah,0h
mov ah,1h
int 21h ;считываем символ
mov ah,0h
mov udal,ax ;и записываем в переменную
mov kol,0h ;обнуляем счётчик
mov ind,0h
mov bx,razmer
add bx,1h
mov razmer,bx ;увеличиваем размер массива на 1
mov bx,offset massiv
mov adres,bx ;начало списка
proverka:
mov bx,kol
add bx,1h
mov kol,bx
mov cx,razmer
cmp bx,cx
je vyvod ;если проверили все элементы,выводим
mov bx,ind
add bx,1h
mov ind,bx
mov bx,adres
mov cx,[bx]
add bx,2h
mov adres,bx ;увеличиваем адрес на 2 байта
mov bx,udal
cmp bx,cx
je sdvig ;если элемент нужно удалить,сдвигаем
jmp proverka
mov bx,offset massiv
mov adres,bx
mov kol,0h
vyvod:
mov ah,2h
mov bx,adres
mov dx,[bx]
int 21h
mov bx,adres
add bx,2h
mov adres,bx
mov bx,kol
add bx,1h
mov kol,bx
mov cx,razmer
cmp bx,cx
jl vyvod
jmp konec
konec:
jmp konec
perevod:
mov ah,0h
mov bx,ax
mov cx,3ah
cmp bx,cx
jl m1
sub bx,40h
add bx,9h
jmp m2
m1:
sub bx,30h
m2:
mov ax,bx
ret
sdvig:
mov k,0h
mov ax,razmer
mov dx,ind
sub ax,dx
m3:
mov cx,[bx+2h]
mov [bx],cx
add bx,2h
mov dx,k
add dx,1h
mov k,dx
mov cx,ax
cmp dx,cx
jl m3
mov ax,razmer
sub ax,1h
mov razmer,ax
ret
n:
jmp n
k dw 0h
ind dw 0h
udal dw 0h ;символ для удаления
razmer dw 0h ;размер списка
kol dw 0h ;счётчик
massiv dw 0h ;начало списка
massiv2 dw 0h ;начало итогового массива
adres dw 0h ;адрес элемента списка
text1 db "Vvedite razmer massiva v 2-x znachnom vide: ",'$'
text2 db 0Dh,0Ah,"Vvedite elementy massiva: ",'$'
text3 db 0Dh,0Ah,"Vvedite elementy dlya udaleniya: ",'$'
end start
|