Консультация # 186387: Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос: Нужна помощь в решении задач по Операционным системам на ассемблере. Задание 3. Написать директивы описания данных и команды пересылок согласно указанному варианту из табл. 4. Если в задании не указано, как инициализировать данные, то предполагается, что иниц...
Консультация # 186388: Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос: Нужна помощь в решении задач по Операционным системам на ассемблере. Задание 5. Написать фрагмент программы на ассемблере (описание переменных и команды вычислений) в соответствии с указанным вариантом. Использовать операторы организации цикла и индексирование. Н...Консультация # 186389: Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос: Нужна помощь в решении задач по Операционным системам на ассемблере. Задание 1. Записать в двоичном и шестнадцатеричном виде представление в памяти ПК следующих чисел (следует учитывать, что числа размером в слово хранятся в «перевернутом» виде), приведенных ниже Чи...Консультация
# 186390: Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос: Нужна помощь в решении задач по Операционным системам на ассемблере. Задание 5. Написать фрагмент программы на ассемблере (описание переменных и команды вычислений) в соответствии с указанным вариантом. Использовать операторы организации цикла и индексирование. П...
Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос: Нужна помощь в решении задач по Операционным системам на ассемблере. Задание 3. Написать директивы описания данных и команды пересылок согласно указанному варианту из табл. 4. Если в задании не указано, как инициализировать данные, то предполагается, что инициализировать не надо. Под большим числом понимается число, для представления которого одного слова недостаточно. Следует, что размер операндов в команде пересылки
должен совпадать – при необходимости использовать оператором указания типа PTR. При написании программного кода можно воспользоваться файлом с примером программы data_mov.asm Таблица 4:
Задание 4. Изучить особенности сложения и вычитания целых чисел в ПК (беззнаковых и со знаком). Разобраться, для чего служат флаги переноса (CF) и переполнен
ия мантиссы (OF). Изучить команды сложения и вычитания, допустимые типы операндов, устанавливаемые флаги. Написать фрагмент программы на ассемблере (описание переменных и команды вычислений) в соответствии с указанным вариантом из табл. 5. Подобрать числовые значения таким образом, чтобы команды устанавливали различные флаги условий (OF,CF,ZF,SF); в каждом варианте – по крайней мере 3 различных флага. В комментариях к командам указать получаемые значения флагов. В заданиях «массив байт» означает
массив целых типа байт, а «массив слов» – массив целых типа слово.
Таблица 5: G – массив из 4 слов. Вычислите сумму элементов массива и результат поместите в DX
; Описание данных и пересылки
S SEGMENT STACK
DW 64 DUP(?)
S ENDS
DAT SEGMENT ; сегмент данных
; ДИРЕКТИВЫ ОПИСАНИЯ ДАННЫХ
A DW 3 dup (?) ; 3 слова неициированных данных
B DD 67452389h ; в памяти будет в обратном порядке: FF FE FB FA
C DB 3 DUP('asm') ; 9 байт = 3 раза 'asm'
D DW 1,2,3,4 ; 4 слова
DAT ENDS
C SEGMENT
ASSUME SS:S,CS:C,DS:DAT
Start PROC FAR
; Выполнение соглашений DOS и настройка регистра DS
PUSH DS
SUB AX,AX
PUSH AX
MOV AX,D ; D - непосредственный операнд, в сегментный регистр
MOV DS,AX ; напрямую не пересылается!!!
;a)
MOV DH, B+3 ;старший байт двойного слова лежит последним
;б)
MOV CL, C+2 ;третий байт лежит по смещению +2
;в)
MOV AX, 0FA98h ;напрямую писать нельзя
MOV ES, AX
;г)
MOV WORD PTR С, DX ;слово в начало последовательности байт
MOV В, AX ;в первое слово
; Возврат в DOS
RET
Start ENDP
C ENDS
END Start
4)
Код :
;Пусть G – массив из 4 слов. Вычислите сумму элементов массива и результат поместите в DX
S SEGMENT STACK
DW 64 DUP(?)
S ENDS
D SEGMENT ; сегмент данных
; ДИРЕКТИВЫ ОПИСАНИЯ ДАННЫХ
M DW 7fffh,0ffffh,0003h,07fffh
D ENDS
C SEGMENT
ASSUME SS:S,CS:C,DS:D
Start PROC FAR
; Выполнение соглашений DOS и настройка регистра DS
PUSH DS
SUB AX,AX
PUSH AX
MOV AX,D ; D - непосредственный операнд, в сегментный регистр
MOV DS,AX ; напрямую не пересылается!!!
MOV AX,G ; AX = 7fffh
ADD AX,G+2 ; AX = 7fffh+0ffffh = 7ffeh с переносом
; O=0, S=0, Z=0, C=1
ADD AX,G+4 ; AX = 7ffeh+0003h = 8001h
; O=1, S=1, Z=0, C=0
ADD AX,G+6 ; AX = 8001 + 7fffh = 0
; O=0, S=0, Z=1, C=1
MOV DX,AX
; Возврат в DOS
RET
Start ENDP
C ENDS
END Start
Консультировал: Лысков Игорь Витальевич (Старший модератор)
Дата отправки: 19.06.2012, 01:08
5
нет комментария ----- Дата оценки: 19.06.2012, 01:46
Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос: Нужна помощь в решении задач по Операционным системам на ассемблере. Задание 5. Написать фрагмент программы на ассемблере (описание переменных и команды вычислений) в соответствии с указанным вариантом. Использовать операторы организации цикла и индексирование. Найти (поместить в регистр BX) меньший из элементов массива из 10 беззнаковых целых типа слово. А так же. Оформить в виде процедур фрагмент программы из задания
№5: 1. С передачей параметров через регистры. 2. Через стек.
;Найти (поместить в регистр BX) меньший из элементов массива
;из 10 беззнаковых целых типа слово
S SEGMENT STACK
DW 64 DUP(?)
S ENDS
D SEGMENT ; сегмент данных
; ДИРЕКТИВЫ ОПИСАНИЯ ДАННЫХ
A DW 1234,2345,3456,4567,5678,6789,8901,9012,10,15234
COUNT EQU ($-A)/2 ; (текущий адрес($) - A) - длина массива в байтах
; поделив на 2 получим число слов в массиве
D ENDS
.186
C SEGMENT
ASSUME SS:S,CS:C,DS:D
Start PROC FAR
; Выполнение соглашений DOS и настройка регистра DS
PUSH DS
SUB AX,AX
PUSH AX
MOV AX,D ; D - непосредственный операнд, в сегментный регистр
MOV DS,AX ; напрямую не пересылается!!!
;передаем параметры через регистры
LEA SI, A ;адрес массива в SI
MOV CX, COUNT ;его длина
MOV BX, 0FFFFH ;минимальное число, пока равно самому большому числу
MIN_LOOP:
MOV AX, [SI] ;очередное слово массива
ADD SI, 2 ;адрес следующего слова
CMP AX, BX
JAE NEXT ;если выше (больше) или равно, то обходим
MOV BX, AX ;сохраняем, как минимального
NEXT:
LOOP MIN_LOOP ;циклим по CX, пока не 0
RET ;результат в BX
Start ENDP
RET
C ENDS
END Start
6,7)
Код :
;Найти (поместить в регистр BX) меньший из элементов массива
;из 10 беззнаковых целых типа слово
S SEGMENT STACK
DW 64 DUP(?)
S ENDS
D SEGMENT ; сегмент данных
; ДИРЕКТИВЫ ОПИСАНИЯ ДАННЫХ
A DW 1234,2345,3456,4567,5678,6789,8901,9012,10,15234
COUNT EQU ($-A)/2 ; (текущий адрес($) - A) - длина массива в байтах
; поделив на 2 получим число слов в массиве
D ENDS
.186
C SEGMENT
ASSUME SS:S,CS:C,DS:D
Start PROC FAR
; Выполнение соглашений DOS и настройка регистра DS
PUSH DS
SUB AX,AX
PUSH AX
MOV AX,D ; D - непосредственный операнд, в сегментный регистр
MOV DS,AX ; напрямую не пересылается!!!
;передаем параметры через регистры
LEA SI, A ;адрес массива в SI
MOV CX, COUNT ;его длина
CALL MIN1 ;поиск минимального
;передаем параметры через стек
PUSH COUNT ;передаем количество
PUSH OFFSET A ;смещение массива
CALL MIN2 ;
RET
Start ENDP
;адрес массива в SI
;его длина в CX
MIN1 PROC
MOV BX, 0FFFFH ;минимальное число, пока равно самому большому числу
MIN_LOOP1:
MOV AX, [SI] ;очередное слово массива
ADD SI, 2 ;адрес следующего слова
CMP AX, BX
JAE NEXT1 ;если выше (больше) или равно, то обходим
MOV BX, AX ;сохраняем, как минимального
NEXT1:
LOOP MIN_LOOP1 ;циклим по CX, пока не 0
RET ;результат в BX
MIN1 ENDP
;параметры в стеке
;сначала передается дина массива
;затем адрес массива
;результат в регистре BX
MIN2 PROC
PUSH BP ;сохраним старое значение BP
MOV BP, SP ;будем адресовать стековый кадр
MOV SI, [BP+4] ;получим в стеке адрес массива
MOV CX, [BP+6] ;количество
MOV BX, 0FFFFH ;минимальное число, пока равно самому большому числу
MIN_LOOP2:
MOV AX, [SI] ;очередное слово массива
ADD SI, 2 ;адрес следующего слова
CMP AX, BX
JAE NEXT2 ;если выше (больше) или равно, то обходим
MOV BX, AX ;сохраняем, как минимального
NEXT2:
LOOP MIN_LOOP2 ;циклим по CX, пока не 0
POP BP ;восстановим старый BP
RET 4 ;при возврате удалим из стека 4 байта (2 слова)!
MIN2 ENDP
C ENDS
END Start
Консультировал: Лысков Игорь Витальевич (Старший модератор)
Дата отправки: 19.06.2012, 01:30
5
нет комментария ----- Дата оценки: 19.06.2012, 01:43
Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос: Нужна помощь в решении задач по Операционным системам на ассемблере. Задание 1. Записать в двоичном и шестнадцатеричном виде представление в памяти ПК следующих чисел (следует учитывать, что числа размером в слово хранятся в «перевернутом» виде), приведенных ниже
Числа для представления в памяти ПК:
Числа-байты: 17, -7, 221 Числа-слова 17, -7, 321
Задание 3. Написать директивы описания данных и команды
пересылок согласно указанному варианту из табл. 4. Если в задании не указано, как инициализировать данные, то предполагается, что инициализировать не надо. Под большим числом понимается число, для представления которого одного слова недостаточно. Следует, что размер операндов в команде пересылки должен совпадать – при необходимости использовать оператором указания типа PTR. При написании программного кода можно воспользоваться файлом с примером программы data_mov.asm Та
блица 4:
; Описание данных и пересылки
S SEGMENT STACK
DW 64 DUP(?)
S ENDS
DAT SEGMENT ; сегмент данных
; ДИРЕКТИВЫ ОПИСАНИЯ ДАННЫХ
F DB 5 dup (?) ; 5 неициированных байт
H DD 0ABCDEF01h ; в памяти будет в обратном порядке: 01 EF CD AB
K DW 4 DUP(1234) ; 4 слова
L DB 'QWRTP' ; 5 согласных
DAT ENDS
C SEGMENT
ASSUME SS:S,CS:C,DS:DAT
Start PROC FAR
; Выполнение соглашений DOS и настройка регистра DS
PUSH DS
SUB AX,AX
PUSH AX
MOV AX,D ; D - непосредственный операнд, в сегментный регистр
MOV DS,AX ; напрямую не пересылается!!!
;a)
MOV DI, H+2 ;старшее слово лежит последним
MOV SI, H ;младшее - первым
;б)
MOV AX, K+2 ;второе слово лежит по смещению +2
;в)
MOV AX, 234
;г)
MOV BYTE PTR H+3, CH ;байт CH на место старшего байта двойного слова
MOV BYTE PTR K+7, CH ;а место старшего байта последнего слова
; Возврат в DOS
RET
Start ENDP
C ENDS
END Start
Консультировал: Лысков Игорь Витальевич (Старший модератор)
Дата отправки: 19.06.2012, 01:49
Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос: Нужна помощь в решении задач по Операционным системам на ассемблере. Задание 5. Написать фрагмент программы на ассемблере (описание переменных и команды вычислений) в соответствии с указанным вариантом. Использовать операторы организации цикла и индексирование. Проверить, упорядочен ли по возрастанию массив из 12 целых со знаком типа байт. А так же. Оформить в виде процедур фрагмент программы из задания №5: 1.
С передачей параметров через регистры. 2. Через стек.
;Проверить, упорядочен ли по возрастанию массив
;из 12 целых со знаком типа байт
S SEGMENT STACK
DW 64 DUP(?)
S ENDS
D SEGMENT ; сегмент данных
; ДИРЕКТИВЫ ОПИСАНИЯ ДАННЫХ
A DB -12,-10,-8,-7,-2,0,8,9,81,100,110,127
COUNT EQU $-A ; (текущий адрес($) - A) - длина массива в байтах
D ENDS
.186
C SEGMENT
ASSUME SS:S,CS:C,DS:D
Start PROC FAR
; Выполнение соглашений DOS и настройка регистра DS
PUSH DS
SUB AX,AX
PUSH AX
MOV AX,D ; D - непосредственный операнд, в сегментный регистр
MOV DS,AX ; напрямую не пересылается!!!
;передаем параметры через регистры
LEA SI, A ;адрес массива в SI
MOV CX, COUNT ;его длина
MOV AH, -128 ;предыдущий элемент, пока - самое маленькое число
CMP_INC_LOOP:
MOV AL, [SI] ;очередное слово массива
INC SI ;адрес следующего слова
CMP AL, AH ;сравним с предыдущим
JLE NO_INC ;если меньше или равно, то массив не упорядочен по возрастанию
MOV AH, AL ;сохраняем предыдущего
LOOP CMP_INC_LOOP ;циклим по CX, пока не 0
MOV AL, 1 ;упорядочен
RET ;результат в AL (=1 - упорядочен, =0 - неупорядочен)
NO_INC:
MOV AL, 0 ;неупорядочен
RET
Start ENDP
C ENDS
END Start
6,7)
Код :
;Проверить, упорядочен ли по возрастанию массив
;из 12 целых со знаком типа байт
S SEGMENT STACK
DW 64 DUP(?)
S ENDS
D SEGMENT ; сегмент данных
; ДИРЕКТИВЫ ОПИСАНИЯ ДАННЫХ
A DB -12,-10,-8,-7,-2,0,8,9,81,100,110,127
COUNT EQU $-A ; (текущий адрес($) - A) - длина массива в байтах
D ENDS
.186
C SEGMENT
ASSUME SS:S,CS:C,DS:D
Start PROC FAR
; Выполнение соглашений DOS и настройка регистра DS
PUSH DS
SUB AX,AX
PUSH AX
MOV AX,D ; D - непосредственный операнд, в сегментный регистр
MOV DS,AX ; напрямую не пересылается!!!
;передаем параметры через регистры
LEA SI, A ;адрес массива в SI
MOV CX, COUNT ;его длина
CALL CMP_INC1 ;проверка на возрастание
;передаем параметры через стек
PUSH COUNT ;передаем количество
PUSH OFFSET A ;смещение массива
CALL CMP_INC2 ;проверка на возрастание
RET
Start ENDP
;адрес массива в SI
;его длина в CX
;результат в AL (=1 - упорядочен, =0 - неупорядочен)
CMP_INC1 PROC
MOV AH, -128 ;предыдущий элемент, пока - самое маленькое число
CMP_INC_LOOP1:
MOV AL, [SI] ;очередное слово массива
INC SI ;адрес следующего слова
CMP AL, AH ;сравним с предыдущим
JLE NO_INC1 ;если меньше или равно, то массив не упорядочен по возрастанию
MOV AH, AL ;сохраняем предыдущего
LOOP CMP_INC_LOOP1 ;циклим по CX, пока не 0
MOV AL, 1 ;упорядочен
RET ;результат в AL (=1 - упорядочен, =0 - неупорядочен)
NO_INC1:
MOV AL, 0 ;неупорядочен
RET
CMP_INC1 ENDP
;параметры в стеке
;сначала передается дина массива
;затем адрес массива
;результат в регистре AL
CMP_INC2 PROC
PUSH BP ;сохраним старое значение BP
MOV BP, SP ;будем адресовать стековый кадр
MOV SI, [BP+4] ;получим в стеке адрес массива
MOV CX, [BP+6] ;количество
MOV AH, -128 ;предыдущий элемент, пока - самое маленькое число
CMP_INC_LOOP2:
MOV AL, [SI] ;очередное слово массива
INC SI ;адрес следующего слова
CMP AL, AH ;сравним с предыдущим
JLE NO_INC2 ;если меньше или равно, то массив не упорядочен по возрастанию
MOV AH, AL ;сохраняем предыдущего
LOOP CMP_INC_LOOP2 ;циклим по CX, пока не 0
MOV AL, 1 ;упорядочен
JMP CMP_INC_RET;на общий выход (чтобы поправить стек)
NO_INC2:
MOV AL, 0 ;неупорядочен
CMP_INC_RET: ;результат в AL (=1 - упорядочен, =0 - неупорядочен)
POP BP ;восстановим старый BP
RET 4 ;при возврате удалим из стека 4 байта (2 слова)!
CMP_INC2 ENDP
C ENDS
END Start
Консультировал: Лысков Игорь Витальевич (Старший модератор)
Дата отправки: 19.06.2012, 02:35
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались.
Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора -
для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение.
Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал,
который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом.
Заходите - у нас интересно!