MIPS汇编范例复习过程

合集下载

【参考文档】mips汇编范例-范文模板 (13页)

【参考文档】mips汇编范例-范文模板 (13页)

本文部分内容来自网络整理,本司不为其真实性负责,如有异议或侵权请及时联系,本司将立即删除!== 本文为word格式,下载后可方便编辑和修改! ==mips汇编范例篇一:MIPS汇编范例mips汇编语言之实现swap函数收藏此程序用来交换两个整数已在pcspim下编译通过#########################################################programed by stevie zou #### purpose:to swap two values ######10-15-201X######### ############################### text segment ###############.text.globl mainmain: la$t0, number #读取两个整数并放入寄存器$t1,$t2lw$t1, 0($t0)lw$t2, 4($t0)li$v0, 4#打印msg1la$a0, msg1li$v0, 1 #打印转换前$t1中的值move $a0, $t1syscallli$v0, 4 #打印msg2la$a0, msg2syscallli$v0, 1#打印转换前$t2中的值move $a0, $t2syscallmove $t3, $t1#关键部分,在寄存器间move数据move $t1, $t2move $t2, $t3li$v0, 4 #打印msg3la$a0, msg3syscallli$v0, 1 #打印转换后$t1中的值move $a0, $t1syscallli$v0, 4#打印换行符 /nla$a0, msg4syscallli$v0, 1#打印转换后$t2中的值move $a0, $t2########### data segment ##############.datanumber: .word 12,34msg1: .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程序运行结果为:本文来自CSDN博客,转载请标出处明:mips汇编简单实例——一个小计算器收藏其实开始的时候一直在看 mips的指令格式,看了、忘了,没什么效果。

mips汇编语言程序设计实例

mips汇编语言程序设计实例
la$a0,a
syscall
jmain
.asciiz
表示输出一个字符串,以\n换行符结尾。
.data
定义变量
a:.asciizAlpha。
等于:
Stringa=Alpha;
MIPS汇编程序设计
实验目的
1.掌握QTSPIM的调试技术
2.了解MIPS汇编语言与机器语言之间的对应关系。
3.掌握MIPS汇编程序设计
算法设计
.data
#定义用户数据段
Z:.space200.text
#定义用户程序段
main:
#给K,Y分配寄存器并赋初值
#给数组Z[K]分配寄存器
#计算Y-16*(K/4+210)并将结果存入一个寄存器
#将上述寄存器中的结果写入Z[K]
done:
li$v0,10
syscall
源程序代码
.data#定义用户数据段
z:.space200
.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
4.了解C语言语句与汇编指令之间的关系
5.熟悉常见的MIPS汇编指令
6.掌握程序的内存映像
实验任务
用汇编程序实现以下伪代码:要求采用移位指令实现乘除法运算。
intmain()
{intK,Y
intZ[50]
Y=56;

201010101MIPS汇编语...

201010101MIPS汇编语...

z e.g., jr $31 我们就回到了 0x0040001c
subu $s1,$s1,1 bnez $s1,loop #f=n! j result
.data 0x10000200
0x10000200 n: .word 4
2010-10-10
0x10000204 f: .word 0
17
编程指南:(2)分支
.text 0x00400100
fact: sw $ra,0($s7)
addiu $s0,$0,1
lw $s1,0($s4) #$s0=n!
loop: mul $s0,$s1,$s0
subu $s1,$s1,1
bnez $s1,loop #f=n!
j result
.data 0x10000200
n: .word 4
lw $s1,0($s4)
#$s0=n!
loop: mul $s0,$s1,$s0
subu $s1,$s1,1
bnez $s1,loop #f=n!
j result
#$s7为$ra开辟一个地址空间
.data 0x10000200
beq $0,$0, fact result: sw $s0,0($s5)
.text
#将子串即指令或字送入用户文件段
.global main #必须为全局变量
Main: lw $t0, item
2010-10-10
MIPS汇编中的命令见Page625 8
MIPS汇编器:存储器中位置
{ 汇编语言源文件:.s
{ 特殊符号 “.” (点): 表示当前 位置 z “.” MIPS汇编命令标识符 z “label:”
MIPS汇编语言程序设计

汇编语言期末复习总结范文(完整版)

汇编语言期末复习总结范文(完整版)

汇编语言期末复习总结范文(完整版)〔习题1.24〕说明下列指令中源操作数的寻址方式?如果B某=2000H,DI=40H,给出D某的值或有效地址EA的值。

(1)movd某,[1234h]直接寻址,EA=1234H(3)movd某,b某寄存器寻址,D某=2000H(6)movd某,[b某+di]基址变址寻址,EA=2040H第2章8086的指令系统〔习题2.1〕已知DS=2000H、B某=0100H、SI=0002H,存储单元[20220H]~[20223H]依次存放12345678H,[21200H]~[21203H]依次存放2A4CB765H,说明下列每条指令执行完后A某寄存器的内容。

(1)mova某,1200hA某=1200H(2)mova某,b某A某=0100H(3)mova某,[1200h]A某=4C2AH;偏移地址=1200h(4)mova某,[b 某]A某=3412H;偏移地址=b某=0100h(5)mova某,[b某+1100h]A某=4C2AH;偏移地址=b某+1100h=1200h (6)mova某,[b某+i]A某=7856H;偏移地址=b某+i=0100h+0002h=0102h(7)mova某,[b某][i+1100h]A某=65B7H;偏移地址b某+i+1100h=0100h+0002h+1100h=1202h〔习题2.2〕指出下列指令的错误(1)movc某,dl两操作数类型不匹配(2)movip,a某IP指令指针禁止用户访问(3)move,1234h立即数不允许传给段寄存器(DS、CS、SS、ES)(4)move,d段寄存器之间不允许传送(5)moval,300两操作数类型不匹配(6)mov[p],a某目的操作数应为[SI](7)mova某,b某+di源操作数应为[B某+DI](8)mov20h,ah立即数不能作目的操作数〔习题2.8〕请分别用一条汇编语言指令完成如下功能:(1)把B某寄存器和D某寄存器的内容相加,结果存入D某寄存器。

mips金字塔例题

mips金字塔例题

mips金字塔例题引言:MIPS(Microprocessor without Interlocked Pipeline Stages)是一种经典的RISC(Reduced Instruction Set Computing)指令集架构。

在学习MIPS编程的过程中,金字塔例题是一个常见的练习,通过编写MIPS汇编语言来构建一个金字塔的图案。

本文将介绍金字塔的例题,包括实现思路、代码分析和代码实现等方面内容。

一、实现思路金字塔是一个由等腰三角形构成的图案,其中每一行的星号数量递增。

实现金字塔的方法可以通过循环和条件判断语句来实现。

下面是一个实现金字塔的思路:1. 首先,确定金字塔的高度,即金字塔的行数,可以通过用户输入或者在代码中直接指定。

2. 使用两个循环来构建金字塔。

外层循环控制金字塔的行数,内层循环控制每一行的星号数量。

3. 内层循环的次数取决于当前行数,根据公式2*(当前行数)-1可以计算出每一行的星号数量。

4. 在每一行的星号数量确定后,可以通过循环打印星号和空格来构建金字塔。

5. 打印完一行后,换行继续打印下一行的星号。

二、代码分析下面是一个实现金字塔的MIPS汇编代码的分析:1. 通过读取用户输入获取金字塔的高度,保存在寄存器中。

2. 初始化外层循环计数器并保存在寄存器中,用于控制金字塔的行数。

3. 进入外层循环,检查循环计数器是否为0,如果为0则退出循环,否则进入下一次循环。

4. 初始化内层循环计数器并保存在寄存器中,用于控制每一行的星号数量。

5. 进入内层循环,循环计数器递减,检查循环计数器是否为0,如果为0则退出循环,否则进入下一次循环。

6. 打印星号。

7. 内层循环结束,换行。

8. 外层循环计数器递减。

9. 外层循环结束,退出程序。

三、代码实现下面是一个简单实现金字塔的MIPS汇编代码示例:.datamsg: .asciiz "请输入金字塔的高度:"height: .word 0.text.globl mainmain:# 打印提示信息li $v0, 4la $a0, msgsyscall# 读取用户输入li $v0, 5syscallmove $t0, $v0# 保存用户输入到height变量 sw $t0, height# 初始化外层循环计数器li $t1, 1# 外层循环outer_loop:# 判断外层循环是否结束 beqz $t1, exit# 初始化内层循环计数器 move $t2, $t1# 内层循环inner_loop:# 判断内层循环是否结束 beqz $t2, line_break# 打印星号li $v0, 11li $a0, '*'syscall# 内层循环计数器递减 subiu $t2, $t2, 1j inner_loop# 换行line_break:li $v0, 11li $a0, '\n'syscall# 外层循环计数器递减subiu $t1, $t1, 1j outer_loop# 退出程序exit:li $v0, 10syscall结论:通过本文的介绍,我们可以了解到如何使用MIPS汇编语言来实现一个金字塔的例题。

MIPS汇编学习

MIPS汇编学习

MIPS汇编学习MIPS汇编学习 mips汇编不同于x86汇编,属于精简指令集,常见于路由器等⼀些嵌⼊式设备中。

mips汇编没有对堆栈的直接操作,也就是没有push和pop指令,mips汇编中保留了32个通⽤寄存器,但是不同于x86汇编,mips汇编中没有ebp/rbp寄存器。

mips每条指令都⽤固定的长度,每条指令都是四个字节,所以内存数据的访问必须以32位严格对齐,这⼀点也不同于x86汇编。

通过⼀个demo,⽤mips-linux-gnu-gcc编译,通过IDA远程调试,来理解mips汇编中的⼀些概念。

#include<stdio.h>int sum(int a,int b){return a+b;}int main(){int a=1,b=2,c;c=sum(a,b);printf("%d\n",c);return 0;}32个通⽤寄存器的功能和使⽤约定定义如下:mips汇编中重要的寄存器: 1.堆栈指针$sp,也就是$29指向堆栈的栈顶,类似于x86中的ebp和rbp指针; 2.$0寄存器的值始终为常数0; 3.PC寄存器保留程序执⾏的下⼀条指令,相当于x86架构中的eip寄存器; 4.参数传递的时候,$a0-$a3寄存器保存函数的前四个参数,其他的参数保存在栈中; 5.$ra寄存器,保存着函数的返回地址,这⼀点也不同于x86汇编中将返回地址保存在栈中。

在函数A执⾏到调⽤函数B的指令时,函数调⽤指令复制当前的$PC寄存器的值到$RA寄存器,然后跳转到B函数去执⾏,即当前$RA寄存器的值就是函数执⾏结束时的返回地址。

如上图所⽰,调⽤sum函数之前,$ra寄存器的值是0x7f62eca8。

进⼊分⽀延迟槽之后,$ra寄存器的值被赋值为$pc寄存器的下⼀条指令地址。

在结束sun函数调⽤之后,通过:jr $ra指令跳转回main函数继续执⾏。

5.mips架构下,对静态数据段的访问,通过$gp寄存器配合基址寻址来实现; 7.$30寄存器表⽰帧指针,指向正在被调⽤的栈桢,mips和x86由于堆栈结构的区别,调⽤栈时会出现⼀些不同。

MIPS汇编范例

MIPS汇编范例

mips汇编语言之实现swap函数收藏此程序用来交换两个整数已在pcspim下编译通过######################################################### programed by stevie zou #### purpose:to swap two values ###### 10-15-2008 ######### ############################### text segment ###############.text.globl mainmain: la $t0, number #读取两个整数并放入寄存器$t1,$t2 lw $t1, 0($t0)lw $t2, 4($t0)li $v0, 4 #打印msg1la $a0, msg1syscallli $v0, 1 #打印转换前$t1中的值move $a0, $t1syscallli $v0, 4 #打印msg2la $a0, msg2syscallli $v0, 1 #打印转换前$t2中的值move $a0, $t2syscallmove $t3, $t1 #关键部分,在寄存器间move数据move $t1, $t2move $t2, $t3li $v0, 4 #打印msg3la $a0, msg3syscallli $v0, 1 #打印转换后$t1中的值move $a0, $t1syscallli $v0, 4 #打印换行符/nla $a0, msg4syscallli $v0, 1 #打印转换后$t2中的值move $a0, $t2syscall########### data segment ##############.datanumber: .word 12,34msg1: .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程序运行结果为:本文来自CSDN博客,转载请标明出处:/yihaozou/archive/2008/10/19/3081322.aspxmips汇编简单实例——一个小计算器收藏其实开始的时候一直在看mips的指令格式,看了、忘了,没什么效果。

微处理器结构04MIPS ISA与汇编程序实例

微处理器结构04MIPS ISA与汇编程序实例

MIPS
Workstations, Embedded, supercomputers
Licensable architecture, Synthesizeable cores for embedded markets
Cisco, Linksys and Mikrotik's routerboard routers, cable modems and ADSL modems, smartcards, laser printer, set-top boxes, robots, handheld computers, Sony PlayStation 2 and Sony PlayStation Portable, cellphone/PDA applications
Meaning $s1 = $s2 + $s3 $s1 = $s2 - $s3 $s1 = Mem[$s2 + 100] Mem[$s2 + 100] = $s1
Loongson
MIPS寄存器
Register 0 31 Register 1 31

10

10
……
32 GPRs
Register 31 31

10
Design Principle 2: Smaller is faster.
MIPS寄存器命名
No. Name
Usage
No.
0 $zero Constant 0
Meaning
add $s1, $s2, $s3 $s1 = $s2 + $s3
sub $s1, $s2, $s3 $s1 = $s2 - $s3
lw $s1, 100($s2) $s1 = Mem[$s2 + 100]
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

M I P S汇编范例mips汇编语言之实现swap函数收藏此程序用来交换两个整数已在pcspim下编译通过#################################################### ##### programed by stevie zou #### purpose:to swap two values ###### 10-15-2008 ######### ############################### text segment ###############.text.globl mainmain: la $t0, number #读取两个整数并放入寄存器$t1,$t2 lw $t1, 0($t0)lw $t2, 4($t0)li $v0, 4 #打印msg1la $a0, msg1syscallli $v0, 1 #打印转换前$t1中的值move $a0, $t1syscallli $v0, 4 #打印msg2la $a0, msg2syscallli $v0, 1 #打印转换前$t2中的值move $a0, $t2syscallmove $t3, $t1 #关键部分,在寄存器间move数据 move $t1, $t2move $t2, $t3li $v0, 4 #打印msg3la $a0, msg3syscallli $v0, 1 #打印转换后$t1中的值move $a0, $t1syscallli $v0, 4 #打印换行符 /nla $a0, msg4syscallli $v0, 1 #打印转换后$t2中的值move $a0, $t2syscall########### data segment ##############.datanumber: .word 12,34msg1: .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程序运行结果为:本文来自CSDN博客,转载请标明出处:/yihaozou/archive/2008/10/19/3081322.aspxmips汇编简单实例——一个小计算器收藏其实开始的时候一直在看 mips的指令格式,看了、忘了,没什么效果。

现在通过这个例子,简单训练一下: mips汇编中:常用寄存器的使用;系统调用: 1(print_int),4(print_str),5(read_int),10(exit);算术运算: add,sub,mul,div;逻辑运算及跳转;上代码:(汇编写的少,代码书写、风格还很差劲,感谢请大虾指教):view plaincopy to clipboardprint?#sample example 'a small calculater’.text # text section.globl main # call main by SPIMmain:la $t0, value # load address "value" into $t0 la $a0,msg0li $v0,4syscall #print "please choose the operation:" li $v0, 5syscallsw $v0, 8($t0)la $a0,msg1li $v0,4syscall #print "first num:"li $v0, 5syscallsw $v0, 0($t0)la $a0,msg2li $v0,4syscall #print " second num:"li $v0, 5syscallsw $v0, 4($t0) #read the other numla $a0,newlineli $v0,4syscall #print "\n"lw $t1, 0($t0) # load the first numlw $t2, 4($t0) # load the second numlw $t3, 8($t0) # load the operationbeq $t3,1,addOp # if +beq $t3,2,subOp # if -beq $t3,3,mulOp # if *beq $t3,4,divOp # if /addOp:add $t4, $t1, $t2 # $t1 + $t2 = $t4sw $t4, 12($t0) #la $t5,addFlagj printResultsubOp:sub $t4, $t1, $t2 # $t1 - $t2 = $t4 sw $t4, 12($t0)la $t5,subFlagj printResultmulOp:mul $t4, $t1, $t2 # $t1 * $t2 = $t4 sw $t4, 12($t0)la $t5,mulFlagj printResultdivOp:div $t4, $t1, $t2 # $t1 / $t2 = $t4 sw $t4, 12($t0)la $t5,divFlagj printResultprintResult:lw $a0,0($t0)li $v0,1syscall #read first numberla $a0,0($t5)li $v0,4syscall #print opflaglw $a0,4($t0)li $v0,1syscall #print second number la $a0,equalStrli $v0,4syscall #print " = "lw $a0,12($t0)li $v0,1syscall # print sum resultj exitexit:la $a0,newlineli $v0,4syscall #print " \n "li $v0,10syscall # exit# data section.datavalue: .word 0, 0, 0 ,0 ,0 # 0: first num ,4 : second num , 8 : operation , 12:result msg0 : .asciiz " please choose the operation(1~4):\n\t\t1 : +,addition \n\t\t2 : -,subtracter\n\t\t3 : * multiplication \n\t\t4 : /,division\n"msg1 : .asciiz "first num:"msg2 : .asciiz "second num:"addFlag : .asciiz " + "subFlag : .asciiz " - "mulFlag : .asciiz " * "divFlag : .asciiz " / "equalStr : .asciiz " = "newline : .asciiz "\n===============================\n"#sample example 'a small calculater’.text # text section.globl main # call main by SPIMmain:la $t0, value # load address "value" into $t0la $a0,msg0li $v0,4syscall #print "please choose the operation:"li $v0, 5syscallsw $v0, 8($t0)la $a0,msg1li $v0,4syscall #print "first num:"li $v0, 5syscallsw $v0, 0($t0)la $a0,msg2li $v0,4syscall #print " second num:"li $v0, 5syscallsw $v0, 4($t0) #read the other numla $a0,newlineli $v0,4syscall #print "\n"lw $t1, 0($t0) # load the first numlw $t2, 4($t0) # load the second numlw $t3, 8($t0) # load the operationbeq $t3,1,addOp # if +beq $t3,2,subOp # if -beq $t3,3,mulOp # if *beq $t3,4,divOp # if /addOp:add $t4, $t1, $t2 # $t1 + $t2 = $t4sw $t4, 12($t0) #la $t5,addFlagj printResultsubOp:sub $t4, $t1, $t2 # $t1 - $t2 = $t4sw $t4, 12($t0)la $t5,subFlagj printResultmulOp:mul $t4, $t1, $t2 # $t1 * $t2 = $t4sw $t4, 12($t0)la $t5,mulFlagj printResultdivOp:div $t4, $t1, $t2 # $t1 / $t2 = $t4sw $t4, 12($t0)la $t5,divFlagj printResultprintResult:lw $a0,0($t0)li $v0,1syscall #read first numberla $a0,0($t5)li $v0,4syscall #print opflaglw $a0,4($t0)li $v0,1syscall #print second numberla $a0,equalStrli $v0,4syscall #print " = "lw $a0,12($t0)li $v0,1syscall # print sum resultj exitexit:la $a0,newlineli $v0,4syscall #print " \n "li $v0,10syscall # exit# data section.datavalue: .word 0, 0, 0 ,0 ,0 # 0: first num ,4 : second num , 8 : operation , 12:result msg0 : .asciiz " please choose the operation(1~4):\n\t\t1 : +,addition \n\t\t2 : -,subtracter\n\t\t3 : * multiplication \n\t\t4 : /,division\n"msg1 : .asciiz "first num:"msg2 : .asciiz "second num:"addFlag : .asciiz " + "subFlag : .asciiz " - "mulFlag : .asciiz " * "divFlag : .asciiz " / "equalStr : .asciiz " = "newline : .asciiz"\n===============================\n"运行效果截图如下:本文来自CSDN博客,转载请标明出处:/oncoding/archive/2009/07/15/4346531.aspx本文来自CSDN博客,转载请标明出处:/oncoding/archive/2009/07/15/4346531.aspx高精度整数除法(MIPS汇编)收藏.datatitle: .asciiz "\t\t高精度除法演示程序\n"tip1: .asciiz "\n请输入被除数:"tip2: .asciiz "请输入除数:"tip3: .asciiz "要输出小数点后多少位:"tip4: .asciiz "\n是否继续?(y/n)"err: .asciiz "\n除数不能为0,请重新输入\n"dot: .asciiz "."sign: .asciiz "-"buf: .byte 0:16.text.globl __start__start:#输出标题li $v0, 4la $a0, titlesyscall#提示输入被除数并接收输入restart:li $v0, 4la $a0, tip1syscallli $v0, 5syscallmove $t0, $v0#提示输入除数并接收输入input_again:li $v0, 4la $a0, tip2syscallli $v0, 5syscallmove $t1, $v0#检测除数是否为0,是则输出错误信息并跳转到除数输入处,否则继续执行 bnez $t1, nextla $a0, errsyscallj input_again#提示输入要求的小数位数并接收输入next:li $v0, 4la $a0, tip3syscallli $v0, 5syscallmove $t2, $v0#两数进行除法运算,把运算结果保存到寄存器$t8和$t9div $t0, $t1move $s0, $zeromflo $t8mfhi $t9#检测商是否为0,是则继续执行下一步,否则跳转到输出整数结果处bnez $t8, int_result#检测被除数是否为非负数,是则检查除数,否则置$s0为1,$s0用来记录负数的个数bgez $t0, next_checkaddi $s0, $zero, 1#检测除数是否为非负数,是则输出-号,否则$s0加1next_check:bgez $t1, print_signaddi $s0, $s0, 1#输出-号,如果$s0值不为1,即负数个数不为奇数,则跳过此步print_sign:bne $s0, 1, int_resultla $a0, signsyscall#输出整数部分结果int_result:li $v0, 1move $a0, $t8syscall#输出小数点li $v0, 4la $a0, dotsyscall#检测余数是否不小于0,是则跳转到下一步执行,否则取反bgez $t9, next_numneg $t9, $t9#检测除数是否不小于0,是则转入下一步,否则取反next_num:bgez $t1, isloopneg $t1, $t1#余数乘以10,再除以除数,得到新的商和余数isloop:move $t8, $t9mul $t8, $t8, 10div $t8, $t1mflo $t8mfhi $t9#输出新的商li $v0, 1move $a0, $t8syscall#小数位数记录减1,当其大于0时继续回到上一标号处执行,否则转入下一步sub $t2, $t2, 1bgtz $t2, isloop#显示提示信息是否要重新开始,li $v0, 4la $a0, tip4syscall#接收字符输入li $v0, 8la $a0, bufli $a1, 16syscall#输入的第一字符为y时则重新开始, 否则结束程序lbu $t3, bufbeq $t3, 121, restartli $v0, 10syscall本文来自CSDN博客,转载请标明出处:/masm32v9/archive/2010/02/28/5331042.aspx。

相关文档
最新文档