我试图提示用户输入字符串的长度,为该字符串分配空间,然后反向打印出来.
对于我的生活,我无法弄清楚为什么这不起作用..
Sample Output:
(spim) run
Please enter an integer:
7
string
(spim)
Run Code Online (Sandbox Code Playgroud)
现在"字符串"的长度应该是6对吧?+应该成为它的空终止字符7.任何人都可以找到我的方法出错的地方吗?
.data
nl: .asciiz "\n"
inputPrompt: .asciiz "Please enter an integer:\n"
theString: .space 32
theInteger: .word 1
.text
main:
la $a0, inputPrompt #load address a0 with prompt
li $v0, 4 #load system call, print string into v0
syscall
li $v0, 5 #load system call, read int into v0
syscall
sw $v0, theInteger #store saved int into $t0
li $v0, 8 #load system call, read string with mem …Run Code Online (Sandbox Code Playgroud) 给定文件
#include <stdio.h>
int main() {
printf("hello world\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我可以使用命令
clang -emit-llvm hello.c -c -o hello.bc
llc hello.bc -march=mipsel -relocation-model=static -o hello.s
Run Code Online (Sandbox Code Playgroud)
不幸的是,当我尝试在可靠的SPIM模拟器中运行MIPS时,我发现SPIM对象几乎每一行都会产生一个看起来像MIPS代码的好处(放在下面,以避免分解文本).不仅是'.Section .mdebug.abi32'行,而且还有'.cfi*'形式的任何一行 - 甚至更令人困惑(因为它看起来像MIPS给我......)行'lui $ 2,%hi( __gnu_local_gp)"被反对.
我正在寻找有关SPIM和LLVM应对的MIPS的不同风格的一些信息,或者有人提供我可以运行的MIPS模拟器的示例,该模拟器接受LLVM正在生成的MIPS代码.
.Section .mdebug.abi32
.previous
.file "hello.bc"
.text
.globl main
.align 2
.type main,@function
.set nomips16 # @main
.ent main
main:
.cfi_startproc
.frame $sp,32,$ra
.mask 0x80000000,-4
.fmask 0x00000000,0
.set noreorder
.set nomacro
# BB#0: # %entry
addiu $sp, $sp, -32
$tmp2:
.cfi_def_cfa_offset 32
sw $ra, 28($sp) # 4-byte …Run Code Online (Sandbox Code Playgroud) 所以,我不知道装配是如何工作的,也不知道我在做什么.我以为我做了,但当然我错了.所以这是我的问题 - 我甚至不知道如何让用户输入一个整数,所以我可以将它存储在内存中.我也不知道我的变量是否对齐,因为我甚至不理解"对齐"究竟是什么.下面是我的汇编代码,以及显示我想要代码执行的内容的注释.请帮忙
.data
# variables here
intPrompt: .asciiz "\nPlease enter an integer.\n"
stringPrompt: .asciiz "\nPlease enter a string that is less than 36 (35 or less) characters long.\n"
charPrompt: .asciiz "\nPlease enter a single character.\n"
int: .space 4
string: .space 36
char: .byte 1
.text
.globl main
main:
# print the first prompt
li $v0, 4
la $a0, intPrompt
syscall
# allow user to enter an integer
li $v0, 5
syscall
# store the input in `int`
# don't …Run Code Online (Sandbox Code Playgroud) 我写在MIPS某些代码,我已经来到这里的要求是存储结果,暂时在点HI和LO特殊寄存器(均为4个字节宽).这些说明由我掌握:
divu s,t lo <-- s div t ; hi <-- s mod t
multu s,t hi / lo < -- s * t ;
Run Code Online (Sandbox Code Playgroud)
因此,divu存储除法LO和余数的结果HI,同时multu存储乘法LO(低4字节)和HI(高4字节)的结果.
稍后,为了检索结果HI和LO寄存器,我可以:
mfhi $v0
mflo $v1
Run Code Online (Sandbox Code Playgroud)
我已经想出了如何将计算结果存储在LO:
ori $v0,$0,1 # Store result from $a0 into LO
divu $a0,$v0
Run Code Online (Sandbox Code Playgroud)
divu在LO分工的结果保存,所以我只是除以1的结果得到它.但是,存储HI更复杂.一种方法是强制multu指令将值移位32位(4字节):
multu $a0,0x80000000 # Shift $a0 by 32 …Run Code Online (Sandbox Code Playgroud) 我正在尝试手动将使用g ++编译的elf文件的hexdump加载到我设计的处理器模拟中.标准elf文件有30个部分,我正在加载所有30个段,并考虑到它们正确的内存位置偏移.然后我在该.text部分的开头(00400130)启动我的程序计数器,但似乎程序运行不正常.我使用SPIM作为黄金标准,相对彻底地验证了我的处理器设计.奇怪的是,如果我将一个汇编文件加载到SPIM中,然后取出软件生成的反汇编.text和.data部分,将它们加载到我的处理器内存中,程序就可以工作了.这与我想做的不同,因为我想:
我最初应该在ELF文件中放置程序计数器的位置?我现在就开始了.text.另外,我只需要包含.text并使.data我的程序正常工作吗?我在这做错了什么?
你如何在mips程序集中手动管理堆,特别是SPIM模拟器?
堆,我发现在使用sbrk系统调用时从0x10040000开始,例如
li $t0, 1
li $s0, 9
syscall
sw $t0, ($s0) # 1 located at 0x10040000
那么,打电话给sbrk并不能保证你会回到下一个空闲内存插槽吗?例如,如果我为单个4字节空间调用sbrk,SPIM可能会分配地址:0x10040000-0x10040003.但是,对另一个4字节空间的第二次调用可能与之前的4字节分配无关?因此,需要一个数据结构来跟踪哪些内存插槽已被分配?最后,内存管理器是否尝试通过确定特定数据结构跟踪的地址之间的可用空间来减少对sbrk的调用次数?
我是大会的新手.我在从命令行参数中读取字符串时遇到了一些麻烦.
我想将thisismymessage第二个参数中的字符串读入缓冲区.
我想过使用SYSCALL,但不知道如何使用.
$ spim -f program.s file thisismymessage
Run Code Online (Sandbox Code Playgroud) assembly mips computer-architecture spim command-line-arguments
我试图使用sbrk进行动态内存分配.但是,作为SPIM和MIPS的新来者,我无法这样做.我勾勒出一个粗略的代码.
.
data
var: .word 25
.text
main:
li $v0, 9
la $v0, var
lw $a0, var
syscall # DYNAMICALLY ALLOCATING MEMORY OF SIZE 4 BYTES AT ADDRESS OF VAR
sw $v0, var
li $v0, 10
syscall
Run Code Online (Sandbox Code Playgroud) 我需要将我的代码从堆栈指针转换为仅使用帧指针,我该怎么办?我对MIPS很新.
我有这个递归C代码及其下面的MIPS代码.我正在使用堆栈指针,如何更改它以使用帧指针?
这是我的C代码
int fact(int n)
{
if(n!=1)
return n*factorial(n-1);
}
int comb (int n, int k)
{
return fact (n) / fact (k) / fact (n - k);
}
Run Code Online (Sandbox Code Playgroud)
这是我的MIPS代码
comb:
sub $sp, $sp, 16
sw $ra , 0($sp)
sw $s0, 4($sp)
sw $a0, 8($sp)
sw $a1, 12($sp)
jal fact
move $s0, $v0
lw $a0, 12($sp)
jal fact
div $s0, $s0, $v0
lw $a0, 8($sp)
lw $a1, 12($sp)
sub $a0, $a0, $a1
jal fact
div $s0, $s0, $v0 …Run Code Online (Sandbox Code Playgroud) 我刚刚开始使用SPIM模拟器进行MIPS.有人可以帮我转换这个陈述吗?
if(as>47 && as<58) function();
else continue;
Run Code Online (Sandbox Code Playgroud)
Thanx提前.:)
我用 MIPS 汇编写了这个简单的程序:
.data
.text
main:
li $v0, 12 # read_char
syscall
move $a0, $v0
li $v0, 11 # print_char
syscall
j main # repeat forever
Run Code Online (Sandbox Code Playgroud)
当我在 QtSpim 中运行它时,它工作正常:它从控制台获取一个字符,并在输入后立即打印它,然后重复。但是,QtSpim 的控制台不允许我为我的程序粘贴输入(我可以这样做,但不会被读取)。所以我尝试在spim for Linux(命令行)版本 9.1.8 中运行它。它可以工作,但是当输入一个字符时它不会立即做出反应;它总是等待换行符,即使在没有剪切和粘贴的情况下输入字符也是如此。所以我希望这种行为:
(spim) load "echo.asm"
(spim) run
hheelllloo
Run Code Online (Sandbox Code Playgroud)
但我得到了这个:
(spim) load "echo.asm"
(spim) run
hello [I press Enter here]
hello
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?提前致谢。
我正在使用 QtSpim 制作一个快速程序,该程序应该ori对某些整数执行两个按位运算。当我尝试组装程序时,它给了我这个错误消息,说我不能使用相同的标签两次 - 这是我正在使用的书中的确切代码,它不起作用。
## Program to bitwise OR two patterns
.text
.globl main
main:
ori $8,$0,0x0FA5 # put first pattern into register $8
ori $10,$8,0x368F # or ($8) with second pattern. Result to $10.
## End of file
Run Code Online (Sandbox Code Playgroud)
我非常感谢这里的任何人的帮助。