标签归档:MIPS

MIPS用系统功能调用实现简单输入输出

先上代码:

.data

welcome: .ascii “welcome to very9s.net:”

buffer:

.text

main:

li $v0, 8

la $a0, buffer

li $a1, 64

syscall

li $v0, 4

la $a0, welcome

syscall


仿真结果:
输入前的内存空间:
输入后的内存空间:
可见内存里多了输入的内容。

==============================================

编程过程中出现的错误:

  1. 用.asciiz, 应用.ascii。他们的差别在于是否有家终止符。
  2. buffer在welcome前 ,正确的是welcome在buffer前。原因大概是.data中的顺序就是内存地址的顺序。否则输入数据会覆盖welcome中原有的数据。
  3. 8号服务若不设置$a1将默认为1,输入将被忽略。

Service 8 – Follows semantics of UNIX ‘fgets’. For specified length n, string can be no longer than n-1. If less than that, adds newline to end. In either case, then pads with null byte If n = 1, input is ignored and null byte placed at buffer address. If n < 1, input is ignored and nothing is written to the buffer.

由于welcome并没有添加终止符,因此调用4号服务,在屏幕打印字符串时,将会从welcome的起始地址逐位打印直到遇到终止符停止输出。

===============================================

总结:

还是蛮简单的。

MARS-MIPS编程Hello world快速入门

找一找资料,尝试MIPS编程。

1///先上代码( PPT )

How to use SYSCALL system services

Step 1. Load the service number in register $v0.

Step 2. Load argument values, if any, in $a0, $a1, $a2, or $f12 as specified.

Step 3. Issue the SYSCALL instruction.

Step 4. Retrieve return values, if any, from result registers as specified.

==========================================

Example: 在屏幕显示$t0+100的值

li  $v0, 1

li  $t0, 15

add $a0, $t0, 100

syscall

运行结果:

各寄存器的值:

编译成机器代码:

MIPS中的寄存器说明:
MIPS Architecture and Assembly Language Overview

Table of Available Services 系统调用表

把对应的系统服务编码放进$v0中,再syscall就可以调用相应的系统服务。

编码1就是打印$a0中存储的数据。

(为什么是a0呢?因为上面的表格说了a0-a3是用来存储参数argument的)

4号服务就是打印字符串。

10号服务就是退出程序。

##li:load immediate

格式:li register_destination, value

##la:load address

格式:la register_destination, address
MIPS程序结构: %1.Data Declarations

在.data指令之后:将程序将使用的数据存储在RAM中。

%2.Code

在.text指令后:包括程序代码,其中程序代码的起点是main:指令,并用syscall结束程序。

%3.Comments

注释不用说了 ~注释符号是#

2///运行hello_world

编译成机器代码:

MARS运行结果: