龙芯汇编语言程序设计教程

本节目标

  • 了解数据类型
  • 掌握算术运算指令

数据类型

类型 位数 字节数 记号
byte 8 1 b
halfword 16 2 h
word 32 4 w
doubleword 64 8 d

整型算术指令

加法

    add $t2, $t1, $t0     # t2 = t1 + t0
    addi $t2, $t1, 8      # t2 = t1 + 8
    addu $t2, $t1, $t0    # unsigned, t2 = t1 + t0
    addiu $t2, $t1, 8     # unsigned, t2 = t1 + 8

doubleword(64 bit):

dadd, daddi, daddu, daddiu

减法

sub $t2, $t1, $t0    # t2 = t1 - t0
subu $t2, $t1, $t0   # unsigned, t2 = t1 - t0

doubleword(64 bit):

dsub, dsubu

乘法

mul $t2, $t1, $t0  # t2 = t1 * t0
mult $t2, $t1      # t2 * t1 ---> HI,LO
multu $t2, $t1     # unsigned, t2 * t1 ---> HI,LO

doubleword(64bit):

dmult, dmultu

除法

div $t2, $t1        # t2/t1 --> LO, t2%t1 ---> HI
divu $t2, $t1       # unsigned, # t2/t1 --> LO, t2%t1 ---> HI

doubleword(64bit):

ddiv, ddivu

有算 \sqrt{x}, \sqrt[n]{x},log(x), a^x, sin(x), cos(x) 的指令吗?

答案是没有!

所有其它运算都要转换成加减乘除等算术运算,比如:

sin(x) = x - \frac{x^3}{3!} + \frac{x^5}{5!} - \frac{x^7}{7!} + \frac{x^9}{9!} - \dots

编程练习

(a^2 - b^2)/2 = ?
/* calc.s */
	.text
	.global main
	.ent main
main:	li $t0, 6	   # a --> t0
	li $t1, 4	   # b --> t1
	mul $t2, $t0, $t0  # t2 = a^2
	mul $t3, $t1, $t1  # t3 = b^2
	sub $a0, $t2, $t3  # a0 = t2 - t3 = a^2 - b^2
	li $a1, 2	   # a1 = 2
	div $a0, $a1	   # (a^2 - b^2) / 2 --> lo
                           # remainder --> hi
	mflo $v0
	jr $ra
	.end main

例如:

更多的GDB命令:

命令 作用 简记
list 显示源码 l
disassemble 反汇编 disas
step 执行一行源码 s
stepi 执行一条指令  

除数为0的问题

被零除属于严重错误,会发生核心转储:

$ ./calc
Floating point exception (core dumped)

查看core dump情况:

$ coredumpctl list calc
TIME                            PID   UID   GID SIG PRESENT EXE
Thu 2017-09-28 18:59:29 CST    1328  1000  1000   8 * /home/brep/Lectures/lesson3/calc

用gdb调试core dump文件:

$ coredumpctl gdb