Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Не пойму суть кода

44K
23 мая 2011 года
m9yt
25 / / 27.02.2010
Добрый вечер.
Парюсь с задачей, уже надоела...
Сама задача: Вычесть из массива в дополнительном сегменте массив, хранимый в сегменте данных, при условии неравенства элементов. Массив-разность разместить в сегменте данных.
Код:
title lab4
page ,132
;сегмент стека
sta segment para stack 'stack'
db 255 dup('stack')  ; область стека
sta ends
;сегмент данных
dseg segment
str1 db 'Enter mas1:$'
str2 db 'Enter mas2:$'
str3 db 'Result:'
mas1 db 10 dup ('$') //1 массив
mas3 db 10 dup ('$')// 3 массив
dseg ends

eseg segment
mas2 db 10 dup ('$') // 2 массив
eseg ends

subttl lab5
page
;сегмент кода
cseg segment
assume cs:cseg,ds:dseg,ss:sta,es:eseg
entry proc far   ;начало процедуры
push ds        ;сохраняем в стек начальное значение ds
sub ax,ax    ;обнуляем ax
push ax        
mov ax,dseg    ;инициализация адреса сегмента данных
mov ds,ax

mov ah, 09h            ;сообщение №1
mov dx, offset str1
int 21h

mov ah, 0Ah
mov dx, offset mas1    ; вводим первый массив
int 21h

mov dl,0ah
mov ah,2            ;перевод каретки
int 21h

mov ah, 09h
lea dx, mas1+2    ;вывод первого массива
int 21h  

mov dl,0ah
mov ah,2            ;перевод каретки
int 21h

mov ah, 09h
mov dx, offset str2    ;вывод второго сообщения
int 21h

mov ah, 0Ah
mov dx, offset mas2    ; вводим второй массив
int 21h

mov dl,0ah
mov ah,2            ;перевод каретки
int 21h

mov ah, 09h
lea dx, mas2+2    ;вывод второго массива
int 21h


mov cx,5   ;счетчик элементов в массиве
mov di,offset mas2+2   ;адрес первого элемента первого массива-источника(сегм. доп. данных)        
mov bx,offset mas1+2 ;адрес первого элемента второго массива-источника(сегм. данных)
mov si,offset mas3+2    ;адрес первого элемента массива-приемника

again:
    mov al,es:[di]       ;запись из дополнительного сегмента данных по адресу смещения указанному в di, в младший байт аккумулятора
    mov ah,[bx]          ;запись из сегмента данных по адресу смещения указанному в bx, в старший байт аккумулятора

    cmp al,ah           ;сравнение элементов
    jne a                 ;если неравны, то на а

    inc bx               ;увеличение адреса текущих элементов в первом массиве
    inc di           ;увеличение адреса текущих элементов в втором массиве

    a:
    sub al,ah            ;разность
    mov [si],al           ;запись элементов в массив-приемник          
    inc si               ;увеличение адреса смещения массива-приемника
    inc bx               ;увеличение адреса текущих элементов в первом массиве
    inc di           ;увеличение адреса текущих элементов в втором массиве
loop again         ;конец цикла

mov dl,0ah
mov ah,2            ;перевод каретки
int 21h

mov ah, 09h
mov dx, offset str3    ;вывод третьего сообщения
int 21h

mov dl,0ah
mov ah,2            ;перевод каретки
int 21h

mov ah, 09h
lea dx, mas3+2    ;вывод третьего массива
mov   ah,1
int   21h  

ret                ;возврат из процедуры
entry endp           ;конец процедуры
cseg ends             ;конец сегмента кода
end entry             ;конец программного модуля
252
24 мая 2011 года
koderAlex
1.4K / / 07.09.2005
код корявый , но ничего сверхсложного . и комментарии есть .
в чкаком месте непонятно ?
44K
24 мая 2011 года
m9yt
25 / / 27.02.2010
Цитата: koderAlex
код корявый , но ничего сверхсложного . и комментарии есть .
в чкаком месте непонятно ?


Он нерабочий. Нужно поправить, чтобы работало. Ошибка, скорее всего, при записи в 3 массив.

252
24 мая 2011 года
koderAlex
1.4K / / 07.09.2005
у вас массивы по 10 байт , а в счётчик цикла загружаете 5 .
к смещению массивов зачем-то двойку прибавляете .
в случае равенства элементов инкремент указателей проходит ДВА раза .
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог