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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.02.2016, 15:40   #1
krone989
 
Регистрация: 11.02.2016
Сообщений: 4
По умолчанию Ассемблер. массив. Правка кода.

дана подпрограмма
[spoiler]
Код:
.286
.model small

.stack 100h

st_ segment para stack
db 256 dup (?)
st_ ends

.data

s1 db 'sum_p'
s2 db 'sum_otr'

dat segment para public
massiv dw -15,15,8,-3,10,9
;после завершения цикла в этой переменной
sum_p dw 0 ;сумма положительных
sum_otr dw 0 ;сумма отрицательных
dat ends

.code

cod segment para public

assume cs:cod,ss:st_,ds:dat

start: 
mov ax, 03 ; очистка экрана
int 10h
mov ax,dat
mov ds,ax
mov ax,st_
mov ss,ax

mov cx,6
xor si,si
label1:
mov ax,massiv[si]
test ax,8000h
jnz otric
add sum_p,ax
jmp next
otric:
add sum_otr,ax
next:
add si,2
loop label1
  	
xor ax,ax
int 16h
mov	ax,4C00h
int	21h
;
cod ends
end start
[/spoiler]

изменить/дополнить код так чтобы
а) размерность и элементы массива набирать руками
б) вывод переменных sum_p и sum_otr производился на экран по окончанию цикла
krone989 вне форума Ответить с цитированием
Старый 12.02.2016, 09:19   #2
krone989
 
Регистрация: 11.02.2016
Сообщений: 4
По умолчанию

задача 4го курса. а я на 1м учусь и даже не програмист, то есть вообще не в теме. пытался сам сделать но на экран выводится какая то каша из стеков, начиная с абракадабры и заканчиавая куском текста про борланд (тот что при сборке пакета в терминал падает). просто сказали если помогу сделать - поговорят с преподом чтобы пулемет проставить.
krone989 вне форума Ответить с цитированием
Старый 12.02.2016, 16:09   #3
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

..для этого нужны 2 дополнительные/функции: сохранения и вывода чисел.
Вот тебе код на FASM. Функция сохранения - ASC2HEX; вывода - HEX2ASC.
Числа со-знаком размером байт (т.е.макс +/-127). Разделитель чисел - запятая.
Последнее число в массиве тоже должно заканчиваться запятой, после чего следует Enter (см.скрин):

Код:
ORG 100h
JMP start

mess0   DB  13,10,'TYPE ARRAY  :  $'
mess1   DB  13,10,'POSITIVE SUM:  $'
mess2   DB  13,10,'NEGATIVE SUM: -$'
mess3   DB  13,10,'INPUT ERROR!$'
p_Sum   DW  0            ; место под сумму положительных
n_Sum   DW  0            ; ..и отрицательных.

start:                   ;
   MOV   AH,9            ; запрос на ввод массива..
   MOV   DX,mess0        ;
   INT   21h             ;

@create:                 ;
   XOR   AX,AX           ; ждём клавишу..
   INT   16h             ;
   CMP   AL,13           ; ENTER - заканчиваем ввод
   JE    next            ;
   CMP   AL,'-'          ; проверка на отрицательное число
   JE    negative        ;
   MOV   BX,10           ; множитель для ASC2HEX
   CALL  ASC2HEX         ; вводим в DEC положительное число
   CMP   AL,127          ; знаковый байт равен 127
   JA    error           ; если юзер ввёл больше - ошибка!
   ADD   [p_Sum],AX      ; суммируем все/положительные в переменной
   JMP   @create         ; сл.элемент массива..
negative:                ; юзер вводит отрицательное... =======================//
   INT   29h             ; выводим знак "минус" на экран
   MOV   BX,10           ;
   CALL  ASC2HEX         ; вводим в DEC отрицательное число
   CMP   AL,127          ;
   JA    error           ; проверка на переполнение
   ADD   [n_Sum],AX      ; суммируем отрицательные числа
   JMP   @create         ; сл.элемент массива..

next:                    ;
   MOV   AH,9            ; мессага с положительным результатом
   MOV   DX,mess1        ;
   INT   21h             ;
   MOV   AX,[p_Sum]      ;
   MOV   BX,10           ; делитель для HEX2ASC
   CALL  HEX2ASC         ; вывод результата на экран!

   MOV   AH,9            ; мессага с отрицательным результатом
   MOV   DX,mess2        ;
   INT   21h             ;
   MOV   AX,[n_Sum]      ;
   MOV   BX,10           ;
   CALL  HEX2ASC         ;
   JMP   exit            ;

error:                   ; обработчик ошибки!
   MOV   AH,9            ;
   MOV   DX,mess3        ;
   INT   21h             ;

exit:                    ;
   XOR   AX,AX           ; по-любой
   INT   16h             ;    клавиши
   INT   20h             ;        на выход!

;ннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн
HEX2ASC:                 ; Функция переводит числа в символы
   PUSHA                 ; Вход:  АХ = число, BX = система счисления
   XOR   CX,CX           ; Выход: на экране
isDiv:                   ;
   XOR   DX,DX           ;
   DIV   BX              ;
   PUSH  DX              ;
   INC   CX              ;
   OR    AX,AX           ;
   JNZ   isDiv           ;
isOut:                   ;
   POP   AX              ;
   CMP   AL,9            ;
   JLE   noHex           ;
   ADD   AL,7            ;
noHex:                   ;
   ADD   AL,30h          ;
   INT   29h             ;
   LOOP  isOut           ;
   POPA                  ;
RET                      ;
;===================================================================
ASC2HEX:                 ; Процедура переводит символы в числа
   XOR   CX,CX           ; Вход:  ВХ = система счисления
   XOR   AX,AX           ; Выход: АХ = число в указанной СС
NextDigit:               ;
   MOV   AH,1            ; ввод с эхо средствами DOS
   INT   21h             ;
   CMP   AL,','          ; запятая указывает на выход!
   JE    Stop            ;
   AND   AX,0Fh          ; переводим символ в цифру
   XCHG  AX,CX           ; меняем последнее и ранее/введёное число
   XOR   DX,DX           ; взводим флаги нуля и чётности
   MUL   BX              ; умножаем AX на BX. Результат в АХ
   ADD   CX,AX           ; прибавляем его к CX. Теперь в CX введёное число
   JMP   NextDigit       ; следующий символ..
Stop:                    ;
   MOV   AX,CX           ;
RET
Изображения
Тип файла: png sum.png (4.0 Кб, 48 просмотров)
Нашедшего выход - затаптывают первым..

Последний раз редактировалось R71MT; 12.02.2016 в 16:14.
R71MT вне форума Ответить с цитированием
Старый 13.02.2016, 13:53   #4
krone989
 
Регистрация: 11.02.2016
Сообщений: 4
По умолчанию

спасибо
krone989 вне форума Ответить с цитированием
Старый 15.02.2016, 18:53   #5
krone989
 
Регистрация: 11.02.2016
Сообщений: 4
По умолчанию

последнвй вопрос. ult e fasm дебаггер и какие нужны для него ключи
krone989 вне форума Ответить с цитированием
Старый 15.02.2016, 22:25   #6
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

..качаеш FASM, копируешь эт код в его окно, и жмёшь [F9]
Никакие "ult e fasm дебаггер и ключи" ему не нужны.
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Требуется правка PHP кода 5fera Фриланс 2 21.12.2015 22:40
Правка кода Kot070 Помощь студентам 8 30.07.2014 13:11
[Ассемблер] Нужна небольшая правка. JinYa Помощь студентам 0 23.09.2011 21:06
Правка кода nighthack Общие вопросы по Java, Java SE, Kotlin 3 26.04.2011 04:52