Консультация № 186365
13.06.2012, 22:46
500.00 руб.
0 5 1
Здравствуйте! Прошу помощи в следующем вопросе: Нужна помощь в решении задач по Операционным системам на ассемблере.
Используется платформа (для х86-совместимых: Windows
Предпочителен ассемблер MASM

Задание 1
Bezymyannyi.bmp (387.8 кб)

Задание 3
zadanie_3.JPG (166.5 кб)

Задание 4
zadanie_4.JPG (69.9 кб)

Задание 5
Написать фрагмент программы на ассемблере (описание переменных и команды вычислений) в соответствии с указанным вариантом. Использовать операторы организации цикла и индексирование.

(Вопрос к заданию 5)Найти последний положительный элемент массива из 10 целых со знаком типа слово.

Задания 6,7. Оформить в виде процедур фрагмент про-граммы из задания №5 (в двух вариантах: с передачей парамет-ров через регистры (задание 6) и через стек (задание 7)). При написании программного кода можно воспользоваться файлами с примерами программ, размещенными на преподавательском диске P в папке «Гундорова\ОС_заочники».

пример программhttps://rfpro.ru/upload/8511
Методичка




Обсуждение

давно
Посетитель
7438
7205
13.06.2012, 23:22
общий
это ответ
Здравствуйте, Денис!
Задание 1:
Числа-байты:
34 = 00100010b = 22h
-29 = 11100011b = 0e3h
200 = 11001000b = 0c8h
Обратите внимание, что число 200 можно рассматривать только как беззнаковое,
т.к. в байте знаковое число может быть только в пределах от -128 до 127

Числа-слова:
34 = 00100010 00000000b = 2200h
-29 = 11100011 11111111b = 0e3ffh
400 = 10010000 00000001b = 9001h

Байты в двоичной записи, для наглядности, отделил пробелом

Задание 3:
[code h=200]; Описание данных и пересылки
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[/code]
Задание 4:
[code h=200];Краткая справка по необходимым флагам
;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[/code]
Задание 5:
[code h=200]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[/code]
Задания 6 и 7:
[code h=200];Оформлено в виде процедур:
;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[/code]
5
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
13.06.2012, 23:25
общий
Остальные добавлю по мере написания
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
14.06.2012, 00:52
общий
3,4 можете уже смотреть
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
14.06.2012, 01:36
общий
Вот и все
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
14.06.2012, 12:05
общий
Прошу прощения, Денис.
Я в 5,6,7 решил не ту задачу:
надо было найти последний положительный, а я искал максимального из положительных.
Ответ подправил. Перепишите...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа