Поменять местами числа, если у них разные знаки - Assembler
Формулировка задачи:
смотрите next. почему то программа вообще никаких действий с массивом не производит и выводит исходный.
Если использовать в next. команду jns, то в результате бред сумасшедшего получается.
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: 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). Код делится на две части:
- Первая часть (от mov до jl) проверяет, является ли первое число отрицательным (это определяется по регистру al). Если это так, то код переходит к следующей части.
- Вторая часть (от mov до jmp) проверяет, является ли второе число отрицательным (это определяется по регистру dl). Если это так, то код меняет местами числа (это делается с помощью xchg). После выполнения всех операций, код возвращается в начало (к инструкции next) для обработки следующей пары чисел. В конце кода есть две инструкции jmp, которые позволяют избежать лишнего выполнения кода (если второе число отрицательное, то нет необходимости проверять первое число).
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д