使用陷阱使用SPARC指令集在程序集中输出字符

时间:2018-03-16 01:48:24

标签: assembly io subroutine sparc

我的任务如下:

考虑下面的汇编代码,编写一个成功执行的陷阱,打印出“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

0 个答案:

没有答案