Sou novo no universo assembly e não consigo encontrar uma maneira simples de escrever um valor numérico no console com RISC-V64. Quero fazer algo assim:
.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
Mas tenho uma falha de segmentação. Obrigado
Se você quiser alguma informação sobre meu problema, pergunte-me!
O mesmo programa pode escrever strings sem problemas...
Você está usando a
Write
chamada de sistema, que grava bytes em um arquivo, possivelmentestdout
, mas pode ser qualquer arquivo aberto.Sua assinatura é
Write ( int fileHandle, char *byteBuffer, int byteCount );
.Você não forneceu o ponteiro de byte apropriado para
byteBuffer
o parâmetro, em vez disso, você forneceu um inteiro simples que não é um ponteiro, então quando ele interpreta obuffer
parâmetro como um ponteiro como ele está esperando, ele trava. Esta é uma incompatibilidade de tipo clássica, que uma linguagem de alto nível teria prevenido, mas incompatibilidades de tipo estão entre muitos erros que a linguagem assembly está disposta a deixar você cometer sem reclamar em tempo de construção.Para imprimir bytes usando
Write
, você precisará fornecer um endereço de memória (ponteiro) para os bytes que deseja gravar. No entanto, para começar de um número para imprimir, você também precisará converter o inteiro (resultado da adição) do formato numérico para uma sequência de bytes na memória e, em seguida, passar o endereço dessa sequência de bytes e seu comprimento paraWrite
.A maioria dos sistemas de computador tem uma maneira de escrever bytes ascii/unicode, então, para imprimir um número usando esses recursos, converta o número em uma sequência de bytes de caracteres ascii que represente o número em alguma base numérica, como decimal, e então imprima essa sequência de bytes.
Se estiver usando RARS e quiser simplesmente imprimir um inteiro no console em decimal, há um
ecall
, chamadoPrintInt
, e ele imprimirá o inteiro que você colocar ema0
. Seuecall
número é 1 (vai paraa7
). Essa é uma maneira simples e fácil de imprimir inteiros no console (e mesmo que ele converta internamente o número em uma string de bytes para saída do console, não há como usar esse para fazer uma string de bytes para outros propósitos).Não há opções com
ecall
1 (printInt) para imprimir em uma base numérica diferente ou para imprimir zeros à esquerda, ou para imprimir sem sinal.Se você quisesse alguma coisa disso, você precisaria olhar novamente
Write
e fornecer a sequência de bytes de caracteres a serem impressos com alguma programação adicional, geralmente chamada deitoa
(ou seja, inteiro para ASCII).