我的任务如下:
考虑下面的汇编代码,编写一个成功执行的陷阱,打印出“It is a Trap”消息并返回主代码。
我相信大部分工作已经完成,这可能是一个简单的问题,但我在没有任何装配知识的情况下工作,所以我仍然非常需要一些帮助。我理解陷阱的概念而不是语法,所以我真正想知道的是问题所寻求的是什么样的答案。
<>中朝向底部的部分它说“过去的陷阱代码在这里”它是否期望我像方法一样编写“陷阱”子程序?或者它应该更像是代码顶部的部分,它写成“陷阱:ta 0”零指的是什么?我相信命令'ta'指的是“始终陷阱”而'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