Поменять местами числа, если у них разные знаки - Assembler

Узнай цену своей работы

Формулировка задачи:

смотрите 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
Если использовать в next. команду jns, то в результате бред сумасшедшего получается.
next:
    
        mov    al, arr1[si]    
        mov    dl,arr1[si+1]            
        jns    skip         
        mov    al,arr1[si]    
        xchg    arr1[si+1],al    
        mov    arr1[si],al   
        jmp    skip

Решение задачи: «Поменять местами числа, если у них разные знаки»

textual
Листинг программы
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

Объяснение кода листинга программы

В данном коде происходит обмен знаками чисел в определенном массиве (arr1), если эти числа имеют разные знаки. Каждое число хранится в двух соседних ячейках массива, поэтому для доступа к числу используется индекс, увеличенный на 1 (si+1). Код делится на две части:

  1. Первая часть (от mov до jl) проверяет, является ли первое число отрицательным (это определяется по регистру al). Если это так, то код переходит к следующей части.
  2. Вторая часть (от mov до jmp) проверяет, является ли второе число отрицательным (это определяется по регистру dl). Если это так, то код меняет местами числа (это делается с помощью xchg). После выполнения всех операций, код возвращается в начало (к инструкции next) для обработки следующей пары чисел. В конце кода есть две инструкции jmp, которые позволяют избежать лишнего выполнения кода (если второе число отрицательное, то нет необходимости проверять первое число).

Оцени полезность:

14   голосов , оценка 3.571 из 5
Похожие ответы