我是汇编领域的新手,我找不到使用 RISC-V64 在控制台中写入数字值的简单方法。我想做这样的事情:
.data
x: .word 10
y: .word 2
.text
.global _start
_start:
li a0, 1
lw s0, x
lw s1, y
add a1, s0, s1
li a2, 2
li a7, 64
ecall
但是我遇到了分段错误。谢谢
如果您想了解我的问题的任何信息,请问我!
相同的程序可以毫无问题地写入字符串......
我是汇编领域的新手,我找不到使用 RISC-V64 在控制台中写入数字值的简单方法。我想做这样的事情:
.data
x: .word 10
y: .word 2
.text
.global _start
_start:
li a0, 1
lw s0, x
lw s1, y
add a1, s0, s1
li a2, 2
li a7, 64
ecall
但是我遇到了分段错误。谢谢
如果您想了解我的问题的任何信息,请问我!
相同的程序可以毫无问题地写入字符串......
您正在使用
Write
系统调用,它将字节写入文件,可能是stdout
,但也可能是任何打开的文件。其签名是
Write ( int fileHandle, char *byteBuffer, int byteCount );
。您没有为
byteBuffer
参数提供正确的字节指针,而是提供了一个不是指针的简单整数,因此当它buffer
按照预期将参数解释为指针时,它会崩溃。这是一个典型的类型不匹配,高级语言可以避免这种情况,但类型不匹配是汇编语言愿意让您犯的众多错误之一,而不会产生构建时投诉。为了使用 打印字节
Write
,您需要提供要写入的字节的内存地址(指针)。但是,要从要打印的数字开始,您还需要将整数(加法的结果)从数字形式转换为内存中的字节字符串,然后将该字节字符串的地址及其长度传递给Write
。大多数计算机系统都有办法写入 ascii/unicode 字节,因此要使用这些工具打印数字,请将该数字转换为 ascii 字符的字节串,该字节串以某些数字基数(如十进制)表示该数字,然后打印该字节串。
如果使用 RARS,并且您只想以十进制形式将整数打印到控制台,则有一个
ecall
名为 的不同方法PrintInt
,它将打印您放入 中的整数a0
。它的ecall
数字是 1(放入a7
)。这是一种将整数打印到控制台的简单易行的方法(尽管它在内部将数字转换为用于控制台输出的字节字符串,但无法使用此方法将字节字符串用于其他目的)。没有带有
ecall
1(printInt)的选项来以不同的数字基数打印或打印前导零,或打印无符号。如果您想要其中任何一项,您会回头查看
Write
并提供要打印的字节字符串以及一些通常称为itoa
(即整数到 ascii)的附加编程。