Доброго времени суток. Так как я, откровенно, не силен в Эссемблере, прошу проверить, то что я написал и по возможности указать на ошибки.
Вот само задание:
Вот собственно технические требования, записанные с точностью, с его слов. Текст программы:
Написать макрокоманду для выборки из некоторого массива слов со знаком всех элементов больших
одного значения, но меньших другого. С помощью этой макрокоманды обработать два массива, выбирая из 1-го элементы большие 1000, но меньшие 2000, а из 2-го - большие (-5000), но меньшие 5000
Name Program
min1 = 1000 ; промежуток от 1000 до 2000
max1 = 2000
min2 = -5000 ; промежуток от -5000 до 5000
max2 = 5000
;Описание переменных
Data segment
X1 dw 4B0h
dw 8520h
dw 3EDh
dw 7D1h
dw 384h
dw 601h
Y1 dw 6 Dup(?)
X2 dw 8300h
dw 1F4h
dw 0F448h
dw 13ECh
dw 0EC14h
dw 0D05h
Y2 dw 6 dup(?)
Data ends
Stack SEGMENT
DW 16 dup(?)
StkTOp LABEL word
Stack ends
Code SEGMENT
ASSUME CS: Code, DS: Data, ES: Data, SS: Stack
abc macro X, Y, N, min, max ; x - входной массив. у - выходной массив. n - кол-во чисел во входном массиве. min, max - промежуток для выборки
local M1, M2
mov cx, N ; кол-во чисел
lea si, X ; адрес массива чисел
lea di, Y ; адрес выходного массива
M1: mov ax, [si] ; загружаем первое число
cmp ax, min ; сравниваем
JL M2 ; если меньше то идем на М2
cmp ax, max ; сравниваем
JG M2 ; если больше идем на M2
mov [di], ax ; выборка числа
add di, type Y ; переходим на другое число
M2: add si, type X ; переходим на следующее число
dec cx ; цикл
JNZ M1
endm
; Основная программа
Start: mov AX, Data
mov DS, AX
mov ES, AX
mov Ax, Stack
mov SS, AX
mov SP, offset StkTop
abc X1, Y1, 6, min1, max1
abc X2, Y2, 6, min2, max2
code ends
end start
Другие языки программирования и технологии
Проверьте простую задачу на Ассемблере
В общем, очень неплохо.
Ошибки такие:
В качестве имени сегмента стека вы используете зарезервированное слово Stack.
В задании требуется выбрать элементы "больших одного значения, но меньших другого", а ваша программа выбирает большие или равные min и меньшие или равные max. Нужно вместо условных переходов JL и JG использовать JLE и JGE соответственно.
И в конце ваша программа после выполнения алгоритма будет просто выполнять находящийся в памяти мусор. Нужно закончить работу программы, вернув управление операционной системе.
Ваша программа, немного "причёсанная":
min1 = 1000 ; промежуток от 1000 до 2000
max1 = 2000
min2 = -5000 ; промежуток от -5000 до 5000
max2 = 5000
;Описание переменных
Data segment
X1 dw 4B0h, 8520h, 3EDh, 7D1h, 384h, 601h
Y1 dw 6 Dup(?)
X2 dw 8300h, 1F4h, 0F448h, 13ECh, 0EC14h, 0D05h
Y2 dw 6 dup(?)
Data ends
_Stack SEGMENT
DW 16 dup(?)
StkTOp LABEL word
_Stack ends
Code SEGMENT
ASSUME CS: Code, DS: Data, ES: Data, SS: _Stack
abc macro X, Y, N, min, max
local M1, M2
mov cx, N
lea si, X
lea di, Y
M1:
mov ax, [si]
cmp ax, min
JLE M2 ; если меньше или равно, то идем на М2
cmp ax, max
JGE M2 ; если больше или равно, идем на M2
mov [di], ax
add di, type Y
M2:
add si, type X
dec cx
JNZ M1
endm
; Основная программа
Start: mov AX, Data
mov DS, AX
mov ES, AX
mov Ax, _Stack
mov SS, AX
mov SP, offset StkTop
abc X1, Y1, 6, min1, max1
abc X2, Y2, 6, min2, max2
mov ah, 4Ch
int 21h
code ends
end start
Ошибки такие:
В качестве имени сегмента стека вы используете зарезервированное слово Stack.
В задании требуется выбрать элементы "больших одного значения, но меньших другого", а ваша программа выбирает большие или равные min и меньшие или равные max. Нужно вместо условных переходов JL и JG использовать JLE и JGE соответственно.
И в конце ваша программа после выполнения алгоритма будет просто выполнять находящийся в памяти мусор. Нужно закончить работу программы, вернув управление операционной системе.
Ваша программа, немного "причёсанная":
min1 = 1000 ; промежуток от 1000 до 2000
max1 = 2000
min2 = -5000 ; промежуток от -5000 до 5000
max2 = 5000
;Описание переменных
Data segment
X1 dw 4B0h, 8520h, 3EDh, 7D1h, 384h, 601h
Y1 dw 6 Dup(?)
X2 dw 8300h, 1F4h, 0F448h, 13ECh, 0EC14h, 0D05h
Y2 dw 6 dup(?)
Data ends
_Stack SEGMENT
DW 16 dup(?)
StkTOp LABEL word
_Stack ends
Code SEGMENT
ASSUME CS: Code, DS: Data, ES: Data, SS: _Stack
abc macro X, Y, N, min, max
local M1, M2
mov cx, N
lea si, X
lea di, Y
M1:
mov ax, [si]
cmp ax, min
JLE M2 ; если меньше или равно, то идем на М2
cmp ax, max
JGE M2 ; если больше или равно, идем на M2
mov [di], ax
add di, type Y
M2:
add si, type X
dec cx
JNZ M1
endm
; Основная программа
Start: mov AX, Data
mov DS, AX
mov ES, AX
mov Ax, _Stack
mov SS, AX
mov SP, offset StkTop
abc X1, Y1, 6, min1, max1
abc X2, Y2, 6, min2, max2
mov ah, 4Ch
int 21h
code ends
end start
Руслан Ныязов
К сожалению из новой версии ответов не видно, выделенные жирным шрифтом исправленные строки. ((
Руслан Ныязов
А нет, видно. Значит, просто не сразу.
Похожие вопросы
- Простая задача на FASM (ассемблер) помогите 3 дня мучаюсь!!!
- задача по ассемблеру.помогите!
- Простейшая задачка на Ассемблере
- Создание алгоритма для решения задачи на Ассемблере!
- Помогите решить задачу на ассемблере!!!
- Пожалуйста решите задачу на Ассемблере
- задача на ассемблере: ввести предложение и заменить в нем символ "а" на символ "о" и наоборот Напишите код пожалуйста
- помогите пожалуйста с задачей по ассемблеру 8086
- Задачи для Ассемблер
- Прокомментируйте плиз простейшую программу на ассемблере.