标签: spim

在MIPS汇编中反转字符串

我试图提示用户输入字符串的长度,为该字符串分配空间,然后反向打印出来.

对于我的生活,我无法弄清楚为什么这不起作用..

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)

string assembly mips spim mips32

5
推荐指数
1
解决办法
2万
查看次数

LLVM/clang输出到MIPS,但不在SPIM中工作

给定文件

#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)

simulator mips llvm clang spim

5
推荐指数
1
解决办法
1570
查看次数

汇编MIPS - 如何将用户的整数存储到内存中?

所以,我不知道装配是如何工作的,也不知道我在做什么.我以为我做了,但当然我错了.所以这是我的问题 - 我甚至不知道如何让用户输入一个整数,所以我可以将它存储在内存中.我也不知道我的变量是否对齐,因为我甚至不理解"对齐"究竟是什么.下面是我的汇编代码,以及显示我想要代码执行的内容的注释.请帮忙

.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)

assembly mips spim mips32

5
推荐指数
1
解决办法
1万
查看次数

将值存储在MIPS的HI和LO寄存器中

我写在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)

assembly mips cpu-registers spim

4
推荐指数
2
解决办法
3万
查看次数

ELF文件格式

我正在尝试手动将使用g ++编译的elf文件的hexdump加载到我设计的处理器模拟中.标准elf文件有30个部分,我正在加载所有30个段,并考虑到它们正确的内存位置偏移.然后我在该.text部分的开头(00400130)启动我的程序计数器,但似乎程序运行不正常.我使用SPIM作为黄金标准,相对彻底地验证了我的处理器设计.奇怪的是,如果我将一个汇编文件加载到SPIM中,然后取出软件生成的反汇编.text和.data部分,将它们加载到我的处理器内存中,程序就可以工作了.这与我想做的不同,因为我想:

  • 写一个c ++程序
  • 使用mipseb-linux-g ++(交叉编译器)编译它
  • hex将所有部分转储到自己的文件中
  • 读取文件并将内容加载到处理器"内存"中
  • 运行程序

我最初应该在ELF文件中放置程序计数器的位置?我现在就开始了.text.另外,我只需要包含.text并使.data我的程序正常工作吗?我在这做错了什么?

c++ compiler-construction simulation elf spim

3
推荐指数
1
解决办法
5184
查看次数

mips内存管理

你如何在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的调用次数?

assembly memory-management mips spim

3
推荐指数
1
解决办法
6830
查看次数

MIPS:从命令行参数中读取字符串

我是大会的新手.我在从命令行参数中读取字符串时遇到了一些麻烦.

我想将thisismymessage第二个参数中的字符串读入缓冲区.

我想过使用SYSCALL,但不知道如何使用.

$ spim -f program.s file thisismymessage
Run Code Online (Sandbox Code Playgroud)

assembly mips computer-architecture spim command-line-arguments

3
推荐指数
1
解决办法
1万
查看次数

使用sbrk进行MIPS动态内存分配

我试图使用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)

spim sbrk

3
推荐指数
1
解决办法
7741
查看次数

使用帧指针MIPS

我需要将我的代码从堆栈指针转换为仅使用帧指针,我该怎么办?我对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)

assembly mips spim qtspim

2
推荐指数
1
解决办法
1万
查看次数

在MIPS中表达此声明

我刚刚开始使用SPIM模拟器进行MIPS.有人可以帮我转换这个陈述吗?

if(as>47 && as<58) function();
else continue;
Run Code Online (Sandbox Code Playgroud)

Thanx提前.:)

c mips spim

1
推荐指数
1
解决办法
1587
查看次数

read_char 系统调用在命令行 spim 中无法正常工作

我用 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)

有任何想法吗?提前致谢。

assembly mips system-calls spim

1
推荐指数
1
解决办法
955
查看次数

为什么我收到 spim: (parser) Label 在运行我的程序时第二次在文件的第 7 行定义?

我正在使用 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)

我非常感谢这里的任何人的帮助。

assembly mips spim qtspim

1
推荐指数
1
解决办法
48
查看次数

汇编语言中or和ori之间有什么不同?

我正在做一个家庭作业,我很困惑我应该使用哪一个.我添加了什么命令.

assembly mips spim

0
推荐指数
1
解决办法
3296
查看次数