汇编语言

打印hello,world

.data
	msg:	.ascii	"Hello, World!\n\0"	#一定要有\0结尾
.text
	la $a0, msg	#必须将msg放入$a0中
	li $v0, 4	#必须将$v0的值设为4
	syscall		#开始打印!

打印整数

.data
	myage:	.word	20
.text
	lw $t1, myage
	move $a0, $t1
	li $v0, 1
	syscall

打印3.14(float类型)

.data
	PI:	.float	3.14
.text
	li	$v0, 2
	lwc1	$f12, PI	#必须是lwc1,c1表示Coproc 1。浮点数必须放在$f12中才能打印。
	syscall

打印3.14(double类型)

.data
	#f单数存float,f双数存double,float可以用double存,反之不行
.text

加法运算

.data
	num1:	.word	5
	num2:	.word	4
.text
	lw $t1, num1($zero)	#为什么要$zero ?
	lw $t2, num2($zero)
	add $a0, $t1, $t2	#减法换成add即可
	li $v0, 1
	syscall

mul乘法

.text
	addi $t1, $zero, 5
	addi $t2, $zero, 3
	mul $t3, $t1, $t2
	add $a0, $zero, $t3
	li $v0, 1
	syscall

mult乘法

.data

.text
	addi $t1, $zero, 2000
	addi $t2, $zero, 20
	mult $t1, $t2
	mflo $a0
	li $v0, 1
	syscall

左移运算

.data

.text
	addi $t1, $zero, 4
	sll $t2, $t1, 2	#相当于乘4
	add $a0, $t2, $zero
	li $v0, 1
	syscall

函数:

	.data
	msg:	.asciiz	"Hi, I'm LeeVing!\n"
	
	.text
main:	jal display	
	li $v0, 10
	syscall
display:
	li $v0, 4
	la, $a0, msg
	syscall
	jr $ra

函数的返回值:

.data
.text
	main:
		addi $a1, $zero, 10
		addi $a2, $zero, 20
		jal addNum
		add $a0, $v1, $zero
	addNum:
		add $v1, $a1, $a2	#习惯将返回值放入Sv1中
		jr $ra
	

s寄存器的保护

.data
	endl:	.asciiz	"\n"
.text
	main:
		addi $s0, $s0, 10
		jal increaseNum
		#换行
		la $a0, endl
		li $v0, 4
		syscall
		#打印原来的s0
		move $a0, $s0
		li $v0, 1
		syscall
    #结束程序
    li $v0, 10
    syscall
	increaseNum:
		addi $sp, $sp, -4	#分配内存空间
		sw $s0, 0($sp)		#将$s0中的内容存入内存中
		addi $s0, $s0, 66
		move $a0, $s0
		li $v0, 1
		syscall
		lw $s0, 0($sp)		#将内存中的信息重写会$s0中
		addi $sp, $sp, 4	#回收内存空间
		jr $ra

函数嵌套出现的问题:

.data
	endl:	.asciiz	"\n"
.text
	main:
		addi $s0, $s0, 10
		jal increaseNum
		#换行
		la $a0, endl
		li $v0, 4
		syscall
		#打印原来的s0
		jal printValue
		#结束程序
		li $v0, 10
		syscall
	increaseNum:
		addi $sp, $sp, -8	#分配内存空间
		sw $s0, 0($sp)		#将$s0中的内容存入内存中
		sw $ra, 4($sp)
		addi $s0, $s0, 66
		jal printValue
		lw $s0, 0($sp)		#将内存中的信息重写会$s0中
		lw $ra, 4($sp)
		addi $sp, $sp, 8	#回收内存空间		
		jr $ra
	printValue:
		li $v0, 1
		move $a0, $s0
		syscall
		jr $ra

输入整数

.data
	age:	.asciiz	"Please enter your age: "
	msg:	.asciiz	"\nyour age is: "
.text
	la $a0, age
	li $v0, 4
	syscall
	
	li $v0, 5
	syscall
	
	move $t0, $v0
	
	la $a0, msg
	li $v0, 4
	syscall
	
	move $a0, $t0
	li $v0, 1
	syscall

输入float

.data
	msg:		.ascii	"Enter the value of PI: "
	zeroValue:	.float	0.0
.text
	main:
		#提示信息
		la $a0, msg
		li $v0, 4
		syscall
		#填充$f4
		lwc1 $f4, zeroValue
		#将float数读取至$f0
		la $v0, 6
		syscall
		#将需要打印的float值放在$f12中
		add.s $f12, $f0, $f4
		#打印float值
		li $v0, 2
		syscall

输入double

.data
	say:	.asciiz	"Enter the value of E: "
.text
	main:
		#打印提示信息
		la $a0, say
		li $v0, 4
		syscall
		#输入double数值
		li $v0, 7
		syscall
		#将$f0中的结果放入$f12
		add.d $f12, $f6, $f0	#$f6也可以改成$f8, $f10等偶数f寄存器
		li $v0, 3
		syscall

输入字符串

.data
	msg:		.asciiz	"Please enter your name: "
	say:		.asciiz	"hello, "
	userInput:	.space	30
.text
	main:
		la $a0, msg
		li $v0, 4
		syscall
	
		la $a0, userInput	
		li $a1, 30		#必须强调输入字符串的最大长度
		li $v0, 8		#输入字符串
		syscall
	
		la $a0, say
		li $v0, 4
		syscall
	
		la $a0, userInput
		li $v0, 4
		syscall
	li $v0, 10
	syscall
	

beq, bne,bgt判断

.data
	eq:	.asciiz	"They are equal!!!\n"
.text
	main:
		li $s1, 12
		li $s2, 12
		beq $s1, $s2, Equal
		li $v0, 10
		syscall
	Equal:	
		la $a0, eq
		li $v0, 4
		syscall

slt rd, rs, rs 如果rs小于rt,则将rd设置为1,否则设置为0

.data
	lessThan:	.asciiz	"The first number is less than the second number!!!"
.text
	main:
		li $t1, 10
		li $t2, 20
		slt $s0, $t1, $t2
		bne $s0, $zero, Say
		
	li $v0, 10
	syscall
	
	Say:
		la $a0, lessThan
		li $v0, 4
		syscall

while循环(其实世界上本没有while循环)

.data
	space:	.asciiz	", "
.text
	main:
		li $t0, 1
	
		while:
			bgt $t0, 10, exit
			jal printValue
			addi $t0, $t0, 1
			j while
		exit:
		li $v0, 10
		syscall
	
	printValue:
		move $a0, $t0
		li $v0, 1
		syscall
		
		li $v0, 4
		la $a0, space
		syscall
		jr $ra
		

数组和while

.data
	myArr:	.space	100
	space:	.asciiz	", "
.text
	#将1~20存入数组中,并逆序打印出来
	main:
		#$t0存储内容,$s0表示下标
		li $t0, 1
		li $s0, 0
		#存数
		while:
			bgt $t0, 19, exit	#为什么是19?
			sw $t0, myArr($s0)
			addi $t0, $t0, 1
			addi $s0, $s0, 4
			j while
		exit:
		
		#取数
		whilee:
			blt $t0, 1, exite
			lw $a0, myArr($s0)
			jal printValue
			addi $t0, $t0, -1
			addi $s0, $s0, -4
			j whilee
		exite:
		
	li $v0, 10
	syscall
	
	printValue:
		li $v0, 1
		move $a0, $t0
		syscall	

		li $v0, 4
		la $a0, space
		syscall
		
		jr $ra

数组的初始化

.data
	myArr:	.word	10:5	#将myArr中的5个元素全部初始化为10
	space:	.asciiz	", "
.text
	main:
		li $t0, 1
		li $s0, 0
		li $s1, 0
		while:
			bgt $t0, 5, exit
			jal printValue
			addi $t0, $t0, 1
			addi $s0, $s0, 4
			j while
		exit:
		
	li $v0, 10
	syscall
	
	printValue:
		li $v0, 1
		lw $a0, myArr($s0)
		addi $s1, $s1, 1
		add $a0, $a0, $s1
		syscall
		li $v0, 4
		la $a0, space
		syscall
		jr $ra

float + float

.data

.text
main:	
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值