Консультация # 186365: Здравствуйте! Прошу помощи в следующем вопросе: Нужна помощь в решении задач по Операционным системам на ассемблере. Используется платформа (для х86-совместимых: Windows Предпочителен ассемблер MASM Задание 1 Bezymyannyi.bmp (387.8 кб) Задание 3
Здравствуйте! Прошу помощи в следующем вопросе: Нужна помощь в решении задач по Операционным системам на ассемблере. Используется платформа (для х86-совместимых: Windows Предпочителен ассемблер MASM
Задание 5 Написать фрагмент программы на ассемблере (описание переменных и команды вычислений) в соответствии с указанным вариантом. Использовать операторы организации цикла и индексирование.
(Вопрос к заданию 5)Найти последний положительный элемент массива из 10 целых со знаком типа слово.
Задания 6,7. Оформить в виде процедур фрагмент про-граммы из задания №5 (в двух вариантах: с передачей парамет-ров через регистры (задание 6) и через ст
ек (задание 7)). При написании программного кода можно воспользоваться файлами с примерами программ, размещенными на преподавательском диске P в папке «Гундорова\ОС_заочники».
Здравствуйте, Денис! Задание 1: Числа-байты: 34 = 00100010b = 22h -29 = 11100011b = 0e3h 200 = 11001000b = 0c8h Обратите внимание, что число 200 можно рассматривать только как беззнаковое, т.к. в байте знаковое число может быть только в пределах от -128 до 127
Байты в двоичной записи, для наглядности, отделил пробелом
Задание 3:
Код :
; Описание данных и пересылки
S SEGMENT STACK
DW 64 DUP(?)
S ENDS
Data SEGMENT ; сегмент данных
; ДИРЕКТИВЫ ОПИСАНИЯ ДАННЫХ
F DB 4 dup (?) ; 4 байта неициированных данных
H DD 99772211h
K DW 5 dup (55cch) ; 4 инициализированных слов
L DB 'AEUIOAE' ; 7 гласных букв
Data ENDS
Code SEGMENT
ASSUME SS:S,CS:Code,DS:Data
Start PROC FAR
; Выполнение соглашений DOS и настройка регистра DS
PUSH DS
SUB AX,AX
PUSH AX
MOV AX,Data ; инициируем сегментный регистр
MOV DS,AX
;a)
MOV SI, WORD PTR H+2 ;старшее слово идет вторым
MOV DI, WORD PTR H ;младшее слово идет первым
;б)
MOV CX, K+4 ;третье слово по смещению 4 от начала К
;в)
MOV AX, 54F8h
;г)
MOV WORD PTR H, SI ;конец H - младшее слово - лежит первым!
MOV K+8, SI ;конец K - последнее слово находится по смещению 8 от начала
; Возврат в DOS
RET
Start ENDP
Code ENDS
END Start
Задание 4:
Код :
;Краткая справка по необходимым флагам
;OF — флаг переполнения. Этот флаг устанавливается в 1, если результат предыдущей
; арифметической операции над числами со знаком выходит за допустимые для них пределы.
; Например, если при сложении двух положительных чисел получается число со старшим битом,
; равным единице (то есть отрицательное) и наоборот.
;CF — флаг переноса. Устанавливается в 1, если результат предыдущей операции
; не уместился в приемнике и произошел перенос из старшего бита или если
; требуется заем (при вычитании), иначе устанавливается в 0.
; Например, после сложения слова 0FFFFh и 1, если регистр, в который надо
; поместить результат, — слово, в него будет записано 0000h и флаг CF = 1.
;ZF — флаг нуля. Устанавливается в 1, если результат предыдущей команды — ноль.
;SF — флаг знака. Этот флаг всегда равен старшему биту результата.
;Пусть G – массив из 4 слов. Вычислите сумму элементов массива и результат поместите в DX
S SEGMENT STACK
DW 64 DUP(?)
S ENDS
D SEGMENT ; сегмент данных
; ДИРЕКТИВЫ ОПИСАНИЯ ДАННЫХ
G 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
Задание 5:
Код :
Stack SEGMENT STACK
DW 64 DUP(?)
Stack ENDS
Data SEGMENT ; сегмент данных
ar dw -2,4,0,-400,500,0,-3,-40,400,10
Data ENDS
Code SEGMENT
ASSUME SS:Stack,CS:Code,DS:Data
Start PROC FAR
; Выполнение соглашений DOS и настройка регистра DS
PUSH DS
SUB AX, AX
PUSH AX
MOV AX, Data
MOV DS, AX
LEA SI, ar ;адрес массива
MOV DX, -1 ;пусть последний положительный = -1, если так и останется, то положительных нет
MOV CX, 10 ;число элементов массива
MAX_LOOP: ;цикл
MOV AX, [SI] ;читаем слово
INC SI ;на следующее слово
INC SI
TEST AX, AX ;проверим на знак
JLE NEXT ;<=0 игнорируем
MOV DX, AX ;сохраняем новый последний
NEXT:
LOOP MAX_LOOP ;циклим по CX
MOV AX, DX ;результат в AX
RET
Start ENDP
Code ENDS
END Start
Задания 6 и 7:
Код :
;Оформлено в виде процедур:
;1. С передачей параметров через регистры.
;2. Через стек.
SStack SEGMENT STACK
DW 64 DUP(?)
SStack ENDS
Data SEGMENT ; сегмент данных
ar dw -2,4,0,-400,500,0,-3,-40,400,10
Data ENDS
.186
Code SEGMENT
ASSUME SS:SStack,CS:Code,DS:Data
Start PROC FAR
; Выполнение соглашений DOS и настройка регистра DS
PUSH DS
SUB AX, AX
PUSH AX
MOV AX, Data
MOV DS, AX
;передаем параметры через регистры
LEA SI, ar
MOV CX, 10
CALL MAX1
PUSH OFFSET ar
PUSH 10
CALL MAX2
RET
Start ENDP
;адрес массива в SI
;число элементов в CX
;результат в AX
MAX1 PROC
MOV DX, -1 ;пусть последний положительный = -1, если так и останется, то положительных нет
MOV CX, 10 ;число элементов массива
MAX_LOOP1: ;цикл
MOV AX, [SI] ;читаем слово
INC SI ;на следующее слово
INC SI
TEST AX, AX ;проверим на знак
JLE NEXT1 ;<=0 игнорируем
MOV DX, AX ;сохраняем новый последний
NEXT1:
LOOP MAX_LOOP1 ;циклим по CX
MOV AX, DX ;результат в AX
RET
MAX1 ENDP
;параметры в стеке, передаются в следующим порядке:
;адрес массива в SI
;число элементов в CX
;результат в AX
MAX2 PROC
PUSH BP ;сохраним старое значение BP
MOV BP, SP ;будем адресовать стековый кадр
MOV SI, [BP+6];адрес массива
MOV CX, [BP+4];число элементов
MOV DX, -1 ;пусть последний положительный = -1, если так и останется, то положительных нет
MOV CX, 10 ;число элементов массива
MAX_LOOP2: ;цикл
MOV AX, [SI] ;читаем слово
INC SI ;на следующее слово
INC SI
TEST AX, AX ;проверим на знак
JLE NEXT2 ;<=0 игнорируем
MOV DX, AX ;сохраняем новый последний
NEXT2:
LOOP MAX_LOOP2 ;циклим по CX
MOV AX, DX ;результат в AX
POP BP ;восстановим старый BP
RET 4 ;при возврате удалим из стека 4 байта (2 слова)!
RET
MAX2 ENDP
Code ENDS
END Start
Консультировал: Лысков Игорь Витальевич (Старший модератор)
Дата отправки: 13.06.2012, 23:22
5
нет комментария ----- Дата оценки: 15.06.2012, 21:09
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались.
Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора -
для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение.
Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал,
который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом.
Заходите - у нас интересно!