Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [ASM] Поменять местами числа с разными знаками 
:(
    Опции темы
Nikich500
Дата 17.11.2014, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 3.11.2014

Репутация: нет
Всего: нет



Программа должна менять два соседних числа в массиве если у них разные знаки.
Смотрите next: там этот алгоритм.
Код

 stack segment para stack 'stack'
        db 100h dup(?)
stack ends
 
data segment para public 'data'
        arr1 db 3,-5,7,21,-3,9,0,11,-14,2
        n=$-arr1
        sign db ?
data ends
 
code segment para public 'code'
        assume cs: code, ds: data, ss: stack
start:
        mov ax,data
        mov ds,ax
 
;это нужно сделать здесь
        mov     cx, n-1
 
restart:
        xor     si, si
 
next:
    
        mov    al, arr1[si]    
        and    al,10000000b    
        mov    sign,al     
        
        mov    dl,arr1[si+1]    
        and    dl,10000000b
        cmp    dl,sign        
        je    skip         
        mov    al,arr1[si]    
        xchg    arr1[si+1],al    
        mov    arr1[si],al   
        jmp    skip
 
 
skip:
        inc     si
        cmp     si, cx
        jb      next
        loop    restart        
;вывод массива
mov si,offset arr1
        mov cx,n
outpt:
        xor ax,ax
        lodsb
        cbw
        call OutInt
        mov ah,02h
        mov dl,' '
        int 21h
        loop outpt
        mov ax,4c00h
        int 21h
OutInt proc
        push ax
        push bx
        push cx
        push dx
        test ax,ax
        jns oi1
        mov cx,ax
        mov ah,02h
        mov dl,'-'
        int 21h
        mov ax,cx
        neg ax
oi1:
        xor cx,cx
        mov bx,10
oi2:
        xor dx,dx
        div bx
        push dx
        inc cx
        test ax,ax
        jnz oi2
        mov ah,02h
oi3:
        pop dx
        add dl,'0'
        int 21h
        loop oi3
pop dx
pop cx
pop bx
pop ax
        ret
OutInt endp
        mov ax,4c00h
        int 21h
code ends
end start

По сути я сдесь взял знаки и если они совпадают то идем дальше а если не совпадают то меняем местами. НО почему то после выполнения программы в результате числа не меняются. Прошу помощи

Добавлено через 5 минут и 6 секунд
сделал по немножко другому алгоритму:
next: Если a<0, то next1, иначе если (а+1)>=0, то пропускаем, иначе меняем местами.
next1: Если (a+1)<0, то пропускаем, иначе меняем местами...
Код

next:
        mov    al, arr1[si]    
        mov    dl,arr1[si+1]  
        cmp al,0       
        jl    next1
        cmp dl,0
        jge skip        
        mov    al,arr1[si+1]    
        xchg    arr1[si],al    
        mov    arr1[si+1],al   
        jmp    skip
next1:
        cmp dl,0
        jl skip        
        mov    al,arr1[si+1]    
        xchg    arr1[si],al    
        mov    arr1[si+1],al   
        jmp    skip

Однако сдесь в итоге у меня из массива=(3,-5,5,21,-3,9,0,11,-14,2) получился массив=(3,-5,5,21,9,-3,0,11,-14,2), получается что поменялись местами только -3 и 9... почему то остальные не меняются=((
PM MAIL   Вверх
ФедосеевПавел
Дата 23.11.2014, 06:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 7.2.2009

Репутация: 2
Всего: 10



Можно попробовать проверять условие следующим образом:

if sign(a[si]) <> sign([si+1]) then обменять
что эквивалентно
if ( sign(a[si]) xor sign([si+1]) ) <> 0 then обменять

Функция sign - это по-сути старший бит числа, т.е. sign(a[si]) = 10000000b and a[si].

В результате - меньше сравнений, меньше ветвлений, упрощается программа.


------------------------------------------------------

Sorry, невнимательно читал 1-ю программу.

Я взял 1-й исходник, закоментировал 43-ю строку "loop    restart" и перенёс определение стека в конец файла - почему-то забивались нулями первые байты массива в сегменте данных.

Код

Исходный
3 -5 7 21 -3 9 0 11 -14 2
Результат
-5 3 7 -3 21 9 0 -14 11 2



Это сообщение отредактировал(а) ФедосеевПавел - 23.11.2014, 08:18
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0433 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.