Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.12.2014, 12:23   #1
newbieee
Пользователь
 
Регистрация: 24.10.2014
Сообщений: 20
Стрелка массив из 5 чисел

Ниже приведен пример текста программы, которая на языке ассемблер в заданном массиве определяет элемент с максимальной величиной.

Задание: Требуется разработать ассемблерную программу для обработки массива из 5 чисел в соответствии с данными ниже.
Вид обработки: Найти сумму абсолютных величин
Тип массива: Байт

Код:
SGSTACK SEGMENT PARA STACK 'STACK'
    DB 32 DUP(?)
SGSTACK ENDS
 
DATA SEGMENT PARA PUBLIC 'DATA'
    MAX DW ?
    ARRAY DW 10H, 20H, 30H, 0D0H,0A0H
DATA ENDS
 
CODE SEGMENT PARA PUBLIC 'CODE'
        ASSUME CS:CODE, DS:DATA, SS:SGSTACK
 
START:  MOV AX, DATA    ; загрузить в DS
        MOV DS, AX  ;селектор сегмента данных
        LEA BX, ARRAY   ; загрузить в BX начальный адрес массива
        MOV CX, 4       ; инициализировать счетчик
        MOV AX, [BX]    ; инициализировать начальное значение max
        
CYCLE:  ADD BX, 2       ; перейти к следующему элементу массива
        CMP [BX], AX    ; сравнить два значения
        JBE BE      ; переход если равен или ниже
        MOV AX, [BX]    ; сохранить большее значение
BE:     LOOP    CYCLE   ; проверка на выход из цикла (--CX при CX=0)
        MOV MAX, AX ; сохранение максимального значения
        
EXIT:       XOR AL, AL  ; выход в OS
        MOV AH, 4CH
        INT 21H
CODE ENDS
END START
newbieee вне форума Ответить с цитированием
Старый 15.12.2014, 12:42   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Что-то в таком духе надо полагать:
Код:
format MZ

push    cs
pop     ds

mov cx,4 ;Итератор для цикла
xor bx,bx ;Сумматор
mov si,arr ;Указатель на массив
for:
 mov al,[si] ;Получаем число
 cmp al,0
 jg plus
 neg al ;преобразуем как абсолют
plus: 
 add bl,al ;Суммируем
 inc si ;Перебираемся на следующий элемент.
loop for

 ret


;section '.data' data readable writable
arr db 1,-2,3,4,-5
I'm learning to live...

Последний раз редактировалось Stilet; 15.12.2014 в 12:44.
Stilet вне форума Ответить с цитированием
Старый 16.12.2014, 08:44   #3
vadimych
Форумчанин
 
Регистрация: 16.01.2011
Сообщений: 325
По умолчанию

Без переходов.
Код:
.model tiny
.code
org 100h
start:

mov si,offset array
mov cx,sizeof array/2
xor bx,bx
xor dx,dx

@@:
lodsw
test ax,ax
sets dl
neg dx
xor ax,dx
neg dx
add ax,dx
add bx,ax
loop @b

ret
array dw -400,8,-800,4,10
end start
vadimych вне форума Ответить с цитированием
Старый 16.12.2014, 08:54   #4
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

vadimych,
что бы инструкцию sets компилятор понял - нужно после .code добавлять строку .686
Mikl___ вне форума Ответить с цитированием
Старый 16.12.2014, 14:24   #5
vadimych
Форумчанин
 
Регистрация: 16.01.2011
Сообщений: 325
По умолчанию

Mikl___,
Microsoft (R) Macro Assembler Version 10.00.30319.01 понимает без этого. Не отставай от жизни.
vadimych вне форума Ответить с цитированием
Старый 16.12.2014, 14:59   #6
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

vadimych,
согласись, что понять какая версия у ml.exe и link.exe из твоего фрагмента программы невозможно, а с .model tiny у link.exe проблем не возникло? 10 версия, вроде бы, СОМ-программы не создает...
Mikl___ вне форума Ответить с цитированием
Старый 16.12.2014, 15:27   #7
vadimych
Форумчанин
 
Регистрация: 16.01.2011
Сообщений: 325
По умолчанию

Каюсь, не понять. Впредь буду писать версию ассемблера и линкера.
Код:
ml /omf /Zm %*.asm
link16 /t %*.obj;
vadimych вне форума Ответить с цитированием
Старый 16.12.2014, 16:02   #8
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

vadimych,
в компо нет желания сразиться, самому с собой, сам понимаешь, не интересно...
Mikl___ вне форума Ответить с цитированием
Старый 16.12.2014, 16:19   #9
vadimych
Форумчанин
 
Регистрация: 16.01.2011
Сообщений: 325
По умолчанию

Mikl___,
я б с удовольствием. Но пока нет достаточно свободного времени. Извини.
vadimych вне форума Ответить с цитированием
Старый 21.12.2014, 20:43   #10
newbieee
Пользователь
 
Регистрация: 24.10.2014
Сообщений: 20
По умолчанию

Это правильно?) Почему всё что написали, везде ошибки выдает ассемблер! Emu8086 , win7 pro x64,license.

Вот код с сайбер форума, что не так тут?)

Код:
SGSTACK SEGMENT PARA STACK 'STACK'
    DB 32 DUP(?)
SGSTACK ENDS
 
DATA SEGMENT PARA PUBLIC 'DATA'
    SUM DW ?
    ARRAY DB 10H, -20H, 30H, -0D0H,0A0H
DATA ENDS
 
CODE SEGMENT PARA PUBLIC 'CODE'
        ASSUME CS:CODE, DS:DATA, SS:SGSTACK
 
START:  MOV AX, DATA    ; загрузить в DS
        MOV DS, AX  ;селектор сегмента данных
        LEA BX, ARRAY   ; загрузить в BX начальный адрес массива
        MOV CX, 5       ; инициализировать счетчик
        MOV AX, 0       ; инициализировать начальное значение sum
XOR DX,DX
CYCLE:  
        MOV DL,[BX]
        CMP DL,0 ;
        JGE NEXT  ;если число >= 0
        NEG DL ;получить обратное в дополнительном коде
NEXT:
        ADD AX,DX   ; добавить к сумме
        INC BX       ; перейти к следующему элементу массива
        LOOP    CYCLE   ; проверка на выход из цикла (--CX при CX=0)
        MOV SUM AX ; сохранение максимального значения
        
EXIT:       
        XOR AL, AL  ; выход в OS
        MOV AH, 4CH
        INT 21H
CODE ENDS
END START
При запуске такие ошибки:

(6) over 8 bits: -0D0H
(27) insufficient operands for MOV
(27) wrong parameters: MOV SUM AX
(27) probably it's an undefined var: SUM AX
newbieee вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Java: Дан двумерный массив чисел А размером 6х6 и одномерный массив Х из 6-ти чисел. Заменить первые три строки массива A vikysha55 Помощь студентам 1 16.04.2014 10:50
Дан массив из десяти знаковых чисел. Требуется поменять местами пары соседних чисел. Nokard Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 05.01.2014 16:39
Задан массив целых чисел, который может содержать повторяющиеся члены. Вычислить сколько чисел входят в массив более чем по одному nubiknovo Паскаль, Turbo Pascal, PascalABC.NET 6 20.11.2013 00:50
Дан массив из N целых чисел. Получить из него массив чисел по модулю меньших 10 и отсортировать его(язык си++) mitja-zakelidis Помощь студентам 2 15.03.2012 03:10