Другие языки программирования и технологии

ассемблер .органицация циклов и одномерные массивы.есть несколько вопросов

1.поменять местами первый и последний положительный эл вектора а. числа вектора я задала 1,3,-4,5,8,-7 как это записать в нем,что нужно выбрть именно крайние положительные?
~Happy Boyfriend~
~Happy Boyfriend~
353
Не обязательно делать два прохода. Можно за один проход найти крайние положительные элементы.
16-разрядное приложение для MS DOS:

data segment
a dw 1,3,-4,5,8,-7; Массив
n equ ($-a) shr 1; Кол-во элементов массива
adr dw 2 dup (?); Адреса крайних положительных
data ends
code segment
assume cs:code, ds:data
N64034305:
mov ax,data
mov ds,ax
;...
lea si,a; Загрузка адреса начала массива
mov cx,n; Загрузка счётчика элементов
xor dl,dl; Обнуление счётчика положительных элементов
lea di,adr; Загрузка адреса переменных для адресов положительных
DoLoop:
mov ax,[si]; Зашрузка текущего элемента
test ax,ax; Установка флагов в зависимости от элемента
jz Miss; Элемент = 0 - не положительный, переход
js Miss; Элемент < 0, переход
mov [di],si; иначе сохранение адреса текущего элемента
test dl,dl; проверка счётчика положительных на павенство 0
jnz NoInc; Если не = 0, то первый уже найден, переход
add di,2; иначе переход на адрес последнего положительного
NoInc:
inc dl; увеличение счётчика положительных
Miss:
add si,2; переход к след. элементу массива
loop DoLoop; цикл по элементам массива
cmp dl,2; Если кол-во положительных < 2,
jb NoSwap; то обход обмена местами
mov si,adr; Иначе загрузка адреса первого положительного
mov ax,[si]; Загрузка первого положительного в ах
mov di,adr+2; Загрузка адреса последнего положительного
xchg [di],ax; Обмен ах и последнего положительного
mov [si],ax; ах записывается на место первого положительного
NoSwap:
;...
mov ax,4C00h
int 21h
code ends
end N64034305

Или то же самое, но 32-разрядное приложение для Windows:
.586
.model flat, stdcall
option casemap: none
include kernel32.inc
includelib kernel32.lib

.data
a dd 1,3,-4,5,8,-7; Массив
n equ ($-a) shr 2; Кол-во элементов массива
adr dd 2 dup (?); Адреса крайних положительных

.code
N64034305:
lea esi,a
mov ecx,n
xor dl,dl
lea edi,adr
DoLoop:
mov eax,[esi]
test eax,eax
jz Miss
js Miss
mov [edi],esi
test dl,dl
jnz NoInc
add edi,4
NoInc:
inc dl
Miss:
add esi,4
loop DoLoop
cmp dl,2
jb NoSwap
mov esi,adr
mov eax,[esi]
mov edi,adr+4
xchg [edi],eax
mov [esi],eax
NoSwap:
;...
invoke ExitProcess,0
end N64034305

P.S. Количество положительных в программах используется для вспомогательных нужд, как индикатор.
P.P.S. В Win32 варианте комментарии те же, не смотря на различие в разрядности.
Вадим Немченко
Вадим Немченко
51 590
Лучший ответ
легко и просто. .
1) ищете первый положительный, запоминаете позицию
2) идете с конца до первого положительного
3) меняете их местами.
все просто!
Эдуард Мендали
Эдуард Мендали
74 225