Переписать все отрицательные числа из одного массива в другой - 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
Объяснение кода листинга программы
Вот список с пояснениями:
- defseg mass,absolute=0800h — Эта строка устанавливает сегмент и абсолютный адрес для переменной
mass
. Значение 0800h означает, что переменнаяmass
будет расположена в памяти начиная с адреса 0800. - seg mass — Эта строка устанавливает сегмент для переменной
mass
. - org 0800h — Эта строка устанавливает абсолютный адрес для начала переменной
mass
. - array db 1,-12,3,-24,-5,36,7,-48,-9,50 — Это строка объявляет переменную
array
как массив байтов, который будет содержать следующие значения: 1, -12, 3, -24, -5, 36, 7, -48, -9, 50. - defseg pgm,absolute=0000h — Эта строка устанавливает сегмент и абсолютный адрес для переменной
pgm
. Значение 0000h означает, что переменнаяpgm
будет расположена в памяти начиная с адреса 0000. - seg pgm — Эта строка устанавливает сегмент для переменной
pgm
. - org 0000h — Эта строка устанавливает абсолютный адрес для начала переменной
pgm
. - mvi c,0 — Эта строка устанавливает значение 0 в регистр C.
- mvi d,10 — Эта строка устанавливает значение 10 в регистр D.
- lxi h,array — Эта строка передает адрес ячейки массива
array
в регистры HL. - loop: — Эта строка начинает цикл, который будет повторяться 10 раз.
- add m — Эта строка добавляет элемент массива из регистров HL в аккумулятор.
- js iseven — Эта строка проверяет, является ли число в аккумуляторе отрицательным. Если это так, то управление передается метке
iseven
. - jns isnteven — Эта строка проверяет, является ли число в аккумуляторе положительным или нулевым. Если это не так, то управление передается метке
isnteven
. - iseven: — Эта строка начинается, если число в аккумуляторе отрицательное.
- mov m,a — Эта строка заменяет число в ячейке массива на новое число из аккумулятора.
- sub a — Эта строка очищает аккумулятор.
- inx h — Эта строка повышает адрес ячейки в регистре HL на 1.
- dcr d — Эта строка уменьшает значение в регистре D на 1.
- jnz loop — Эта строка продолжает цикл
loop
, пока не будет достигнуто условие окончания цикла.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д