mips汇编语言程序设计实例

编程语言及工具

99人已加入

描述

  MIPS汇编语言学习

  首先是:

  next_a: bne $v0, ‘a’, next_b #依次判断该字符是否是a,b,c,……,A,B,C,……,1,2,3,……,9,0。若是,则输出对应的串,跳转到main,进行下一次输入与判断,若都不是,则输出‘*’,跳转到main,进行下一次输入与判断。

  li $v0, 4 #下同,不再赘述

  la $a0, a

  syscall

  j main

  .asciiz

  表示输出一个字符串,以“\n“换行符结尾。

  .data

  定义变量

  a: .asciiz “Alpha ”。

  等于:

  String a=“Alpha ”;

  MIPS汇编程序设计

  实验目的

  1. 掌握QTSPIM的调试技术

  2. 了解MIPS汇编语言与机器语言之间的对应关系 。

  3. 掌握MIPS汇编程序设计

  4. 了解C语言语句与汇编指令之间的关系

  5. 熟悉常见的MIPS汇编指令

  6. 掌握程序的内存映像

  实验任务

  用汇编程序实现以下伪代码:要求采用移位指令实现乘除法运算。

  int main()

  { int K, Y

  int Z[50]

  Y = 56;

  for(k=0;k《50;k++)

  Z[K] = Y - 16 * ( K / 4 + 210)

  }

  汇编源程序设计

  算法设计

  .data

  #定义用户数据段

  Z: .space 200 .text

  #定义用户程序段

  main:

  #给K,Y分配寄存器并赋初值

  #给数组Z[K]分配寄存器

  #计算Y - 16 * ( K / 4 + 210) 并将结果存入一个寄存器

  #将上述寄存器中的结果写入Z[K]

  done:

  li $v0,10

  syscall

  源程序代码

  .data #定义用户数据段

  z: .space 200

  .text

  main:

  la $s0,z #$s0=addrz

  li $t0,0 #$s1=k=0

  li $t1,56 #$s2=y=56

  loop:

  slti $t2,$t0,50 #判断k是否于50

  beq $t2,$0,done #当k大于等于50,跳转

  srl $t3,$t0,2 #k/4

  addi $t3,$t3,210 #k/4+210

  sll $t3,$t3,4 #16*(k/4+210)

  sub $t3,$t1,$t3 #y-16*(k/4+210)

  sw $t3,0($s0) #写进z[k]

  addi $s0,$s0,4 #地址移一位

  addi $t0,$t0,1 #k加1

  j loop #循环

  done:

  li $v0 10

  syscall

  源代码调试过程

  1. 装载程序。

  点击file,选择Reinitialize and Load File,把写好的文件导入QtSpim。

  2. 点击“运行”,如图:

  汇编语言

  得到实验结果如下:

  数据段映像:

 汇编语言

  仿真器在真正的用户代码段内增加了部分代码以实现程序运行控制,该仿真器中所有用户代码都必须存储在地址为0x00400000~0x00440000的范围之内。用户代码段将每一行代码的地址,及其对应的机器码都显示给用户,为方便查看,还给出了反汇编得到的汇编指令,而且在注释中显示了用户编写的源代码。通过地址部分信息,我们知道每一行代码的地址都是前一行代码地址+4,即PC+4,机器指令,例如

  [00400044] 012b5822 sub $11, $9, $11 ; 14: sub $t3,$t1,$t3 其中的机器码012b5822=000000 01001 01011 01011 00000 100010B。第一段六位和第六段六位分别为000000B和100010B表示该指令的功能为sub指令,第二段5位为01001B表示第一个源操作数寄存器的编号($t1的编号为9),第三段5位为01011B表示第二个源操作数寄存器的编号($t3的编号为11),第四段5位为01011B表示目的操作数的寄存器编号($t3的编号为11),反汇编得到的汇编指令也很明显地指出了这些数据代表的意义;第五段在这条指令中没有意义。

  其他行数据所表达的意义以此类推同样可以得到。

  Z[k]数据内存映像:

  汇编语言

  整理成表格形式如下:

  汇编语言

  可以看到Z[K]的首地址为10010000,且每个内存中的四个数值都是一样的,且随着地址规律地增加,数值在规律地递减。

  实验总结

  通过本次MIPS汇编程序设计的实验,我再次巩固了理论课所学习的程序代码的编写及书写规范,并将其付诸于实践。

  同时,我也基本掌握了Qtspim软件的应用和程序的调试工作,并更深刻地理解了汇编语言中机器指令的执行方法,对以后的学习定会有莫大的帮助。 代码的编写过程,关键是先整理编写的思路,然后根据课本上的代码指令编写程序。编译过程中,当然会遇到一些困难,但是通过思考和与老师同学的交流,都轻松解决了。

  总的来说,本次实验做得还比较轻松,原理方面容易掌握,操作方面也容易实验。望以后的实验也一样顺利。

  MIPS汇编范例

  mips汇编语言之实现swap函数 收藏 此程序用来交换两个整数 已在pcspim下编译通过

  ##

  ##################################################

  #

  #### programed by stevie zou ###

  # purpose:to swap two values #

  ##### 10-15-2008 ######### ################

  ##

  ############# text segment ###############

  .text

  .globl main

  main: la $t0, number #读取两个整数并放入寄存器$t1,$t2

  lw $t1, 0($t0)

  lw $t2, 4($t0)

  li $v0, 4 #打印msg1

  la $a0, msg1

  syscall

  li $v0, 1 #打印转换前$t1中的值

  move $a0, $t1

  syscall

  li $v0, 4 #打印msg2

  la $a0, msg2

  syscall

  li $v0, 1 #打印转换前$t2中的值

  move $a0, $t2

  syscall

  move $t3, $t1 #关键部分,在寄存器间move数据

  move $t1, $t2

  move $t2, $t3

  li $v0, 4 #打印msg3

  la $a0, msg3

  syscall

  li $v0, 1 #打印转换后$t1中的值

  move $a0, $t1

  syscall

  li $v0, 4 #打印换行符 /n

  la $a0, msg4

  syscall

  li $v0, 1 #打印转换后$t2中的值

  move $a0, $t2

  syscall

  ########### data segment ##############

  .data

  number: .word 12,34

  msg1: .asciiz “the first number is:\n”

  msg2: .asciiz “\nthe second number is:\n”

  msg3: .asciiz “\nnow they are swapped as:\n”

  msg4: .ascii “\n”

  ## end of file

  程序运行结果为:

 汇编语言

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分