以下是代码:
.text
.ent main
.type main, @function
main:
.frame $fp,24,$31 # vars= 8, regs= 1/0, args= 0, gp= 8
addiu $sp,$sp,-24
sw $fp,20($sp)
move $fp,$sp
li $2,1 # 0x1
sw $2,12($fp)
li $2,1 # 0x1
sw $2,8($fp)
# now print -------------------------------------
li $2,1
li $a0,10
syscall
move $2,$0
move $sp,$fp
lw $fp,20($sp)
addiu $sp,$sp,24
j $31
nop
我是如何通过编写单个程序来生成的:
int main(){
int i = 1;
}
然后我自己添加了系统调用语句。我不确定这是对还是错。
答案 0 :(得分:1)
您添加的代码:
# now print -------------------------------------
li $2,1
li $a0,10
syscall
会在标准输出中打印整数10。
如果您希望打印变量i
,则必须先将其值加载到寄存器$a0
中。
假设它尚未存储在寄存器中(顺便说一下就是这种情况),并且存储在堆栈中(相对于$fp
的位置8),您必须:
lw $a0, 8($fp) # Load contents of variable i onto register $a0
li $v0, 1 # service 1 (print integer)
syscall # issue service
答案 1 :(得分:1)
我解决它的方法毕竟只是使用printf调用。 Syscalls从未为我工作过;甚至是答案中描述的方式。
因此要打印值10,我会执行以下操作: -
# printf initialized
lui $2,%hi($LC0) # loading .ascii from $LCO
addiu $2,$2,%lo($LC0)
move $4,$2 # first argument to printf
li $5,10
lw $2,%call16(printf)($28) # printf call to print contents of $5
nop
move $25,$2
jalr $25
nop
lw $28,16($fp) # __printf__ end