我以前认为我知道如何做到这一点.但后来我真的试着去做.这是我写的程序但是Mac的Berkeley S***模拟器说最后一行有语法错误.我做错了什么?
.text
.globl __start
__start:
la $a0,ask
li $v0,4
syscall
li $v0,8
syscall
la $t0,buffer
move $t0,$v0
syscall
la $a0,ret
li $v0,4
syscall
move $a0,$t0
li $v0,4
syscall
.data
ask: .asciiz "Enter string: "
ret: .asciiz "You wrote: "
buffer: .space 100
Run Code Online (Sandbox Code Playgroud) 如何在MIPS中将整数读入局部变量?可能吗?问题要求我使用将整数变量指定为局部变量的概念.#我的教科书中的一个问题.顺便说一下,不是作业!
Thanx提前!:d
我正在使用类似SPIMS或MARS的系统调用函数.
我正在读一个字符串(它可以工作,因为我可以打印出来)如下:
li $v0, 8
la $a0, string
li $a1, 256
syscall
Run Code Online (Sandbox Code Playgroud)
但是,我在访问字符串的单个字符时遇到问题.因此,如果我想访问第一个字符并打印它,我正在尝试这样做:
la $t0, string
lb $a0, ($t0)
li $v0, 4
sys call
Run Code Online (Sandbox Code Playgroud)
如果我尝试这样的事情:
la $a0, string
li $v0, 4
syscall
Run Code Online (Sandbox Code Playgroud)
这会将整个字符串打印为字符串指向整个字符串.
如果我尝试类似的东西:
la $a0, string
lb $a0, ($t0)
li $v0, 4
syscall
Run Code Online (Sandbox Code Playgroud)
它给了我一个出界的错误.我不明白为什么 - 虽然不是一个字节长的字符,这只是将字符串中的第一个字节加载到$ a0?
谢谢
我是学习MIPS汇编代码的新手,我们得到了第一个编码任务.我运行程序时遇到错误(这应该是我们必须编写的另一个函数的测试人员)
"spim :( parser)标签是第二次在文件/ home/jlr247/215_A2_work/jlr247-a2-As main的第13行定义:^"
我的代码是:
.data
.align 4
_arrA: .space 400
_arrB: .space 400
.text
main:
la $t0, _arrA #load base address of array A
la $t1, _arrB #load base address of array B
addi $t2, $zero, 0 #$t2 = i = 0
FILL_LOOP: #initializes all A[] values to 5, all B[] values to 10
slti $t3, $t2, 100 #check i<100
beq $t3, $zero, LOOP_DONE #end loop when i=100
sll $t3, $t3, 2 #multiply shift by 4
add …
Run Code Online (Sandbox Code Playgroud) 在确定 .asciiz 字符串的大小时,我应该考虑终止字符吗?
例如:
.data
string: .asciiz "Hello"
Run Code Online (Sandbox Code Playgroud)
“字符串”的大小是 5 还是 6(字节)?
我试图提示用户输入字符串的长度,为该字符串分配空间,然后反向打印出来.
对于我的生活,我无法弄清楚为什么这不起作用..
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) mips-gcc生成的MIPS汇编代码几乎(但不是完全)运行在Mars MIPS模拟器上。例如:
此外,生成的程序集还没有完全设置好,因此无法正确启动和停止(即,末尾没有sycall 10)。
这些问题似乎都可以通过简单的脚本轻松解决。但是,在我重新发明轮子之前,我想知道:(1)是否有任何gcc标志将使其中的一些问题消失?(2)是否有人知道可以修复mips-gcc输出以使其在火星上运行的现有程序?
(FWIW,我在gcc 3.3.6和4.6.1上看到相同的行为。)
我是汇编语言的新手,我对乘法感到非常困惑。
它说我使用后mult $t0, $t1
结果存储在 Hi 和 Lo 中,我知道这些是特殊寄存器mult
和div
的特殊寄存器,但如何访问它们?
假设我在mult $t0, $t1
where$t0
和$t1
都是 2。我如何得到结果?(4)
所以,我不知道装配是如何工作的,也不知道我在做什么.我以为我做了,但当然我错了.所以这是我的问题 - 我甚至不知道如何让用户输入一个整数,所以我可以将它存储在内存中.我也不知道我的变量是否对齐,因为我甚至不理解"对齐"究竟是什么.下面是我的汇编代码,以及显示我想要代码执行的内容的注释.请帮忙
.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) addi
当使用十六进制立即数时,是否有关于如何在汇编中解释指令(和其他指令)的标准或建议?
例子:
addi $t0, $zero, 0xffff
Run Code Online (Sandbox Code Playgroud)
我期待这意味着相同的addi $t0, $zero, -1
地方0xffff
是符号扩展到0xffffffff
,如由处理器完成的,而是由一个事实,即火星模拟器解释的十六进制数为32张无符号数和尝试的汇编做惊讶addi $t0, $zero, 0x0000ffff
的伪指令(如果启用了伪指令)。
需要明确的是,MARS 的汇编器将该addi $t0, $zero, 0xffff
伪指令组装为多条机器指令,这些指令在寄存器中创建该常量 (65535 = 0xffff),然后在启用伪指令的情况下添加它。MARS 的模拟器可以正确模拟0x2008ffff
( addi $t0, $zero, -1
)等指令。
SPIM 汇编器只是因错误而中止。
我想知道的是,汇编程序是否总是以这种方式解释,以及是否有写或解释的地方,因为我找不到任何东西。