以下是有关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
我了解该程序的总体运行情况,但我不了解一些事情
我们如何从“字符串”中的十六进制数字转到控制台中打印出的字母?
stb %r3, [%r4+COUT]
据我了解,这会将数据存储在%r3中到[%r4 + COUT]。如何更改为相应的字母?
ldub[%r4+COSTAT], %r1
这似乎只有128或0。如果为0,程序将分支返回并再次加载它,导致程序继续执行128。为什么会这样?
控制台输出的内存映射地址在哪里?这是[%r4]还是行的地址
stb %r3, [%r4+COUT]