KuPbI4
Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Подскажите пожалуйста, я вот никак не могу найти ошибку в ассемблере: Условие такое: Переслать массив из дополнительного сегмента в другую область того же сегмента со следующими изменениями элементов: добавить 5, если элемент неравен 0. Работает она с вводом и выводом клавиатуры. Но выводит не так как хотелось увидеть: К примеру: Enter Aarray: 1230 Array: 1111 Dest: 1111 А хотелось бы увидеть Enter Aarray: 1230 Array: 1235 Dest: 1235 и что то подобное Подскажите пожалуйста где ошибка?! Выкладываю код: Код: ;------------------------------// Stack segment //--------------------------------------- sta segment para stack 'stack' ;определяем имя класса (stack) к которому ;относится сегмент с именем sta db 255 dup('stack') ; минимальный размер sta ends ;-----------------------------// Data segment //---------------------------------------- dseg segment Asource db 1,2,3,4 ;012h,01Ch,0Bh,04Fh ;определили массив Asource из 4 констант: Dest db 4 dup(?) ;размер массива приемника dseg ends ;------------------------------------------ DStr segment IAMessage db'Enter Asource:$' OAMessage db'Array Asource:$' ODMessage db'Array Dest:$' DStr ends ;-----------------------------// Code segment //--------------------------------------- cseg segment assume CS:cseg,DS:DStr,ES:dseg,SS:sta ;ассоциация сементных регистров. Entry proc far ;главная процедура. push DS ;при запуске exe прграммы регистр DS ук-ет на ее заголовок,считанный ;в память и т.к тело программы оп-ся как прцедура,то первой ;командой идет push DS, которая сохраняет в стеке нач-ое значение DS. ;------------------------Init ES---------------------------- sub AX, AX ;обнуляем AX mov AX,dseg ;инициализация сегмента доп.данных mov ES,AX ;-------------------------Init DS--------------------------- sub AX,AX ;обнуляем AX mov AX,DStr ;инициализация сегмента данных mov DS,AX ;---------------------------------------------------- mov BX, offset Asource ;массив - источник A call AIn call AInput mov DI, offset Asource ;массив - источник A | - определение индексов для массивов. call AOut call AOutput call Dout call AOutput mov SI, offset Dest ;массив - приемник mov CX, 4 ;счетчик циклов 4 цикла AGAIN: mov AL, ES:[BX+10] ;явное указание индексаторов на сегмент ES(т.к. по умолчанию DS:[BX]) cmp AL, 0 ; jle E ;если равен 0 ,то переход на метку е add AL,5 ;если не равно то прибавляем 5 E: mov [DI],AL ;число из акк. в массив-приемник по адресу из di inc BX ;увеличение адресов текущих элементов в массивах inc DI loop AGAIN ; конец цикла call DOutput ret ;выход из процедуры Entry endp ;конец процедуры ;/////////////////////////////////////////////////////////////////////////////// AIn proc mov AH,9h mov DX, offset IAMessage int 21h ret AIn endp ;////////////////////////////////////////------------------------------------------ AOut proc mov AH,9h mov DX, offset OAMessage int 21h ret AOut endp ;---------------------------------------- DOut proc mov AH,9h mov DX, offset ODMessage int 21h ret DOut endp ;///////////////////////////////////////////////////////////////////////////////// AInput proc sub AL,AL mov CX,4 M: mov AH,01h int 21h mov ES:[BX],AL inc BX Loop M ret AInput endp ;/////////////////////////////////////////////////////////////////////////////////// AOutput proc mov CX, 4 ; mov BX,0000h ; P: mov AH, 2h ; Функция вывода ДОС символа на экран mov DL, ES:[DI] ;Записываем в регистр вывода символ из массива Dest inc SI ; Увеличение счетчика элементов массива int 21h ;Вызываем прерывание которому принадлежит функция Loop P ret AOutput endp ;----------------------------------------- DOutput proc mov CX, 4 ; mov DI,0008h ; S: mov AH, 2h ; Функция вывода ДОС символа на экран mov DL, ES:[DI] ;Записываем в регистр вывода символ из массива Dest inc SI ; Увеличение счетчика элементов массива int 21h ;Вызываем прерывание которому принадлежит функция Loop S ret DOutput endp ;----------------------------------------------------------------------------- cseg ends ; end Entry ;Exit from procedure ;-------------------------------------------// End //------------------------- |
|