SPARC程序集“ Hello World” I / O程序

时间:2019-03-08 02:39:04

标签: assembly io sparc

以下是有关ARC程序的代码和信息:

与控制台输出I / O设备关联的内存地址为:

  • 0xffff0000是控制台(输出)数据端口

  • 0xffff0004是控制台(输出)状态端口,其中位7是就绪标志(0:未就绪,1:就绪)

通过以下方式打印字符:

  • 检查ready标志以查看设备是否准备好进行打印,即检查输出状态端口的第7位是否设置为1

  • 将字符存储到输出数据端口

    ! Prints "Hello, world!\n" in the message area.
    .begin
    BASE.equ 0x3fffc0            !Starting point of the memory mapped region
    COUT.equ 0x0                 !0xffff0000 Console Data Port
    COSTAT.equ 0x4               !0xffff0004 Console Status Port
    .org 2048
    add %r0, %r0, %r2
    add %r0, %r0, %r4
    sethi BASE, %r4
    Loop:ld [%r2 + String], %r3  !Load next char into r3
    addcc %r3,%r0,%r3
    be End! stop if null
    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
    End:halt                      !A non-standard instruction to stop the simulator
    .org 3000                     ! The "Hello, world!" string
    String:0x48, 0x65, 0x6c, 0x6c, 0x6f0x2c, 0x20, 0x77, 0x6f, 0x72 0x6c, 0x64, 0x21, 0x0a, 0
    .end
    

我了解该程序的总体运行情况,但我不了解一些事情

  1. 我们如何从“字符串”中的十六进制数字转到控制台中打印出的字母?

    stb %r3, [%r4+COUT]
    

据我了解,这会将数据存储在%r3中到[%r4 + COUT]。如何更改为相应的字母?

  1. ldub[%r4+COSTAT], %r1
    

这似乎只有128或0。如果为0,程序将分支返回并再次加载它,导致程序继续执行128。为什么会这样?

  1. 控制台输出的内存映射地址在哪里?这是[%r4]还是行的地址

    stb %r3, [%r4+COUT]
    

0 个答案:

没有答案