Мое задание следующее:
Учитывая приведенный ниже ассемблерный код, напишите успешно выполняющуюся ловушку, которая выводит сообщение «Это ловушка» и возвращается к вашему основному коду.
Я считаю, что большая часть работы уже сделана, и это, вероятно, простой вопрос, но я работаю без каких-либо знаний об ассемблере, поэтому мне все еще очень нужна помощь. Я понимаю концепцию ловушек, но не синтаксис, поэтому мне действительно интересно, какой ответ ищет вопрос.
Часть внизу в ‹>, где написано «прошлый код ловушки здесь», ожидает ли я, что я напишу подпрограмму «ловушки» как метод? Или это должно быть больше похоже на часть в верхней части кода, где написано «trap: ta 0», к чему относится ноль? Я полагаю, что команда «та» относится к «ловушке всегда», а «0», вероятно, является номером ловушки? Я думаю, что профессор упомянул, что будет что-то вроде 28 ловушек, чего я действительно не понимаю. Прямо над частью, которая говорит «поместите сюда код ловушки», есть ссылка на «ловушку 15», почему 15? Почему мы переходим от нулевой ловушки к пятнадцатой? Какие еще ловушки подразумеваются в этом коде, я не совсем понимаю.
Является ли ожидаемый код ловушки таким же простым, как «ta 15»? Также каков синтаксис для возврата из ловушки и где в коде это должно быть размещено, или автоматический возврат ловушки после выполнения команды ловушки?
.begin
Main .equ 0xa00
ConsoleCode .equ 0xc00
CharactorString .equ 0xf00 !Start of CharactorString in memory
BASE .equ 0x3fffc0 !Starting point of the memory mapped
!region
COUT .equ 0x0 !0xffff0000 Console Data Port
COSTAT .equ 0x4 !0xffff0004 Console Status Port.
TrapCode .equ 0xff000800 !Start of trap instruction code for trap #0
.org Main
addcc %r0,0,%r1 !Set PSR zero bit to observe instruction ta
!loading PSR values into r18
bne EndMain !Do not call trap if condition not meet
trap: ta 0
EndMain: halt !end of routine
.org ConsoleCode
console: add %r0, %r0, %r2 !Clear r2
add %r0, %r0, %r4 !Clear r4
add %r0, %r0, %r5 !Clear r5
add %r0, %r0, %r7 !Clear r7
sethi BASE, %r4 !Set r4 with the base address 0xffff0000
!for Memory Map IO
ld [StringLength], %r5 !Load the charactor string length in the
!charactor string counter register r5
Loop: ld [%r2 + String], %r3 !Load next char into r3
dec%r5 !decrement the charactor string counter register r5
andncc %r5,0,%r7 !see if it is equal to zero
be EndConsole !stop if the charactor string counter is zero.
Wait: ldub [%r4+COSTAT], %r1
andcc %r1, 0x80, %r1
be Wait
stb %r3, [%r4+COUT] !Print to console
add %r2, 4, %r2 !increment String offset (r2)
ba Loop
EndConsole: jmpl %r15,4,%r0 !Jump back to trap code
.org CharactorString !The "It's a Trap!" string
StringLength: 0xd
String: 0x49, 0x74, 0x27, 0x73, 0x20
0x61, 0x20, 0x54, 0x52, 0x41
0x50, 0x21
.org TrapCode !Start of trap instruction code for trap #15
<paste trap code here>
.end
ta 0
предположительно, печатая сообщение.trap #15
, вероятно, просто опечатка, везде написаноtrap #0
. - person Jester   schedule 16.03.2018