汇编语言
一、概述
汇编语言代替01串组成的机器语言,为了便于程序员记忆和阅读
二、DLX汇编语言指令
1. 算数/逻辑运算指令
① I-类型: OPCODE DR,SR1,Imm
- DR(目标寄存器),SR1(源寄存器)用R0,R1……R31表示, 其中R0地址内的值总是0
- Imm(立即数):#十进制 x十六机制 b进制
16位补码整数,-2^15 ~ 2^15-1
可以用label代替 - 例:ADDI R1,R0,numbers 表示将label numbers表示的10个整数的起始地址内的内容存到R1中去。
② R-类型:OPCODE DR,SR1,SR2
- 例:ADD R3,R3,R4 表示吧R3,R4中的内容相加存入R3
③LHI-类型:LHI DR,Imm
- 例: LHI R1,A 表示吧LABEL A 代表的地址的高16位赋给R1(R1内的是地址,该指令属于地址跳转指令)
这里的高16位表示取前16位数字,后16位补0得到的32位数。
2. 数据传送指令
①加载指令: LW/LB DR,Imm(SR1)
基址寄存器SR1 + 偏移量Imm 得到的地址内的数据加载进DR中
②存储指令:SW/SB Imm(SR1),DR
将DR中的值存到 基址寄存器SR1 + 偏移量Imm 得到的地址内
3. 控制指令
①条件分支指令: OPCODE SR1,LABEL
- 例:BEQZ R2,exit 表示如果R2为0,则下一条要执行的指令为exit表标识的指令
②J指令:J LABEL
表示直接执行 LABEL标识的指令
③JR指令: JR SR1
执行SR1中的指令
④TRAP指令: TRAP Imm
执行Imm代表的任务(这里的Imm是TRAP指令专有的指针)
5. 标记LEBAL
- 字母、下划线、$开头, :结尾
- 使用标记表示的存储单元的特征:该单元为分支指令或J指令的目标, 或该单元包含某个被加载或存储的值
- 标记所表示的地址必须是4的倍数(后两位为0)
6. 注释
- ;开头
- DLX汇编语言指令中不允许有空行, 为了程序结构更清晰,使用注释添加空行
7. 伪操作
- 汇编过程中帮助汇编器工作而发给汇编器的信息。一旦汇编器处理了这条信息, 伪操作就被抛弃掉。
- .开头
- 例:
.data x0000600A 告诉DLX数据起始于单元x0000600A
.align 2 由于DLX中字的起始地址必须是4的倍数,即后2位是0,所以用align 2 调整
.word #10,#3.#4,#6,#8,#-2,#45,#5,#8,#9 将这10个整数 以word的形式 连续存储到 x0000600C~x0000033的地址空间中
.space 4 留出x00006034~x00006037这四个单元
.text x40000000 程序起始于单元x40000000
.global main 一个DLX汇编语言程序可能由多个文件组成,global将main标记 标记为全局标记,可在多个文件中使用。main指令表示程序的起点。
三、汇编过程
1. 两趟扫描
第一次建立符号表(保存标记对应的实际的二进制地址)
第二次利用符号表把汇编语言翻译成机器语言