Переписать все отрицательные числа из одного массива в другой - Assembler

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

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

Суть такая

Дан массив чисел со знаком. Нужно все отрицательные числа переписать в другой массив

Я нашла такое задание на этом форуме, но оно написано на MASM (?), а у меня DosBox. Весь форум я уже перелазила вдоль и поперек. Вставляю код, который нашла в одной из тем, может вам он поможет, мне не помог...
MASM
MODEL SMALL
.STACK 256
.DATA
mas_A db -4h, 78h, 34h, -67h, 67h, 34h, -23h, 87h, -34h, -6Eh
len_mas_A=$-mas_A 
mas_B db len_mas_A dup (?)
.code
Start:
    mov ax,@data
    mov ds,ax
 
    xor si,si
    mov cx,len_mas_A
m1:
    mov al,mas_A[si]
    cmp al,0
    jge m2
    mov mas_B[si],al
m2:
    inc si
    loop m1
Exit:
    mov ax,4c00h
    int 21h
END Start
Я не знаю как это все называется по умному. пишется программа в блокноте, сохраняется .asm, компилируется в .bat. запускается через DosBox 0.74

Решение задачи: «Переписать все отрицательные числа из одного массива в другой»

textual
Листинг программы
defseg mass,absolute=0800h  
    seg mass
    org 0800h      
array   db 1,-12,3,-24,-5,36,7,-48,-9,50 ;массив загрузится начинася с 0800 ячейки
    defseg pgm,absolute=0000h
    seg pgm
    org 0000h      ;новый массив расположиться, начиная с 0-го адреса памяти программ
    mvi c,0        ;0 в регистр C
    mvi d,10       ;10 в регистр D
    lxi h,array    ;передать адрес ячейки массива 0800 в HL
loop:                  ;повторять 10 раз цикл "для"                
    add m          ;добавить элемент массива из HL в аккумулятор
    js iseven      ;если отрицательное число в аккамуляторе то iseven
    jns isnteven   ;если нет то isnoteven     
iseven:
    mov m,a        ;новое число из А в адрес HL, заменяем число
    sub a          ;отчистка аккумулятора
    inx h          ;повышаем на 1 адрес ячейки в регистре HL
    dcr d          ;D=D-1
    jnz loop       ;продолжает цикл loop пока не 
isnteven:
    sub a          ;отчистка аккумулятора
    inx h          ;повышаем на 1 адрес ячейки в регистре HL
    dcr d
    jnz loop
    end

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

Вот список с пояснениями:

  1. defseg mass,absolute=0800h — Эта строка устанавливает сегмент и абсолютный адрес для переменной mass. Значение 0800h означает, что переменная mass будет расположена в памяти начиная с адреса 0800.
  2. seg mass — Эта строка устанавливает сегмент для переменной mass.
  3. org 0800h — Эта строка устанавливает абсолютный адрес для начала переменной mass.
  4. array db 1,-12,3,-24,-5,36,7,-48,-9,50 — Это строка объявляет переменную array как массив байтов, который будет содержать следующие значения: 1, -12, 3, -24, -5, 36, 7, -48, -9, 50.
  5. defseg pgm,absolute=0000h — Эта строка устанавливает сегмент и абсолютный адрес для переменной pgm. Значение 0000h означает, что переменная pgm будет расположена в памяти начиная с адреса 0000.
  6. seg pgm — Эта строка устанавливает сегмент для переменной pgm.
  7. org 0000h — Эта строка устанавливает абсолютный адрес для начала переменной pgm.
  8. mvi c,0 — Эта строка устанавливает значение 0 в регистр C.
  9. mvi d,10 — Эта строка устанавливает значение 10 в регистр D.
  10. lxi h,array — Эта строка передает адрес ячейки массива array в регистры HL.
  11. loop: — Эта строка начинает цикл, который будет повторяться 10 раз.
  12. add m — Эта строка добавляет элемент массива из регистров HL в аккумулятор.
  13. js iseven — Эта строка проверяет, является ли число в аккумуляторе отрицательным. Если это так, то управление передается метке iseven.
  14. jns isnteven — Эта строка проверяет, является ли число в аккумуляторе положительным или нулевым. Если это не так, то управление передается метке isnteven.
  15. iseven: — Эта строка начинается, если число в аккумуляторе отрицательное.
  16. mov m,a — Эта строка заменяет число в ячейке массива на новое число из аккумулятора.
  17. sub a — Эта строка очищает аккумулятор.
  18. inx h — Эта строка повышает адрес ячейки в регистре HL на 1.
  19. dcr d — Эта строка уменьшает значение в регистре D на 1.
  20. jnz loop — Эта строка продолжает цикл loop, пока не будет достигнуто условие окончания цикла.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

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