Переписать все отрицательные числа из одного массива в другой - 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
, пока не будет достигнуто условие окончания цикла.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д