![cover](https://img-blog.csdnimg.cn/9a2d7bca6ee04120b91bb9dbcb361081.png)
LC-3 汇编语言 指令集
LC-3汇编语言指令详解。
目录
碎碎念念
我们在之前的文章中介绍了LC-3的指令构成还有一些注释含义,以及指令的具体讲解,这次我们说说LC-3的汇编语言,文章后面是注释。
LC-3汇编语言
运算类指令
ADD (addition)
寄存器寻址:
ADD DR,SR1,SR2
将SR1与SR2相加的结果放在DR中;
立即数寻址:
ADD DR,SR1,imm
将SR1与立即数imm相加的结果放在DR中。
AND (Bit-wise logical AND)
按位相与:
寄存器寻址:
AND DR,SR1,SR2
将SR1与SR2按位相与的结果放在DR中;
立即数寻址:
AND DR,SR1,imm
将SR1与立即数imm按位相与的结果放在DR中。
NOT (Bit-wise complement)
按位取反:
NOT DR,SR
将SR按位取反的结果放在DR。
数据搬移类指令
LD (load)
读取数据:
相对寻址(PC-relative):
LD DR,LABEL
将标号LABEL所指向的内容存进DR。
ST (store)
写入数据:
相对寻址(PC-relative):
ST SR,LABEL
将SR的内容存进标号LABEL所指向内存单元。
LDI (load indirect)
读取数据:
间接寻址(indirect):
LDI DR,LABEL
将标号LABEL所指向的内容作为地址,将此地址所指向的内容存进DR。
STI (store indirect)
写入数据:
间接寻址(indirect):
STI SR,LABEL
将标号LABEL所指向的内容作为地址,将SR的内容存进此地址所指向的内存单元。
LDR (load base+offset)
读取数据:
基址偏移寻址(base+offset):
LDR DR,BaseR,imm
立即数imm和BaseR的内容相加得到一个地址,将该地址指向的内容存进DR。
STR (store base+offset)
写入数据:
基址偏移寻址(base+offset):
STR SR,BaseR,imm
立即数imm和BaseR的内容相加得到一个地址,将SR的内容存进该地址指向的内存单元。
LEA (load effective address)
立即数寻址:
LEA DR,LABEL
将标号LABEL所指向的值作为地址存进DR。
控制类指令
BR (conditional branch)
条件跳转:
BRN LABEL
如果寄存器的值为负数, 则程序跳转到标号所指向处。
BRZ LABEL
如果寄存器的值为0, 则程序跳转到标号所指向处。
BRP LABEL
如果寄存器的值为正数, 则程序跳转到标号所指向处。
BRNZ LABEL
如果寄存器的值是负数或者是0,即不是正数, 则程序跳转到标号所指向处。
BRNP LABEL
如果寄存器的值为负数或正数,即不是0, 则程序跳转到标号所指向处。
BRZP LABEL
如果寄存器的值为0或者是正数,即不是负数, 则程序跳转到标号所指向处。
BRNZP LABEL
程序无条件跳转到标号所指向处。
BR LABEL
程序无条件跳转到标号所指向处。
JMP (jump)
无条件跳转:
JMP BaseR
程序无条件跳转到BaseR的内容所指定的地址处。
RET (return)
无条件跳转:
RET
程序无条件跳转到R7的内容所指定的地址处,而R7的内容是指向子程序调用指令后的指令地址,实际上就是从子程序跳回来。
RET可以看作是JMP的一个特例。
JSR (jump to subroutine)
无条件跳转:
JSR LABEL
标号LABEL作为子程序的入口地址,程序进入子程序,增量PC保存在R7中(参见RET指令,用于从子程序跳回来)。
JSRR
无条件跳转:
JSRR BaseR
BaseR的内容作为子程序的入口地址,程序进入子程序,增量PC保存在R7中(参见RET指令,用于从子程序跳回来)。
RTI (return from interrupt)
RTI
如果当前处理器运行在特权模式,那么特权模式栈顶部两个单元的内容被弹出,分别赋值给PC和PSR。
如果当前处理器运行在用户模式,那么将引发“特权模式冲突”的异常。
TRAP (system call)
TRAP trapvector8
程序进入由trapvect8指定的系统调用的服务程序,增量PC保存在R7中,参见RET指令,用于从服务程序跳回来。
Trap服务程序
trapvector | 汇编语言 | 功能 |
---|---|---|
x20 | GETC | 从键盘读入一个字符。 |
x21 | OUT | 在屏幕上显示字符。 |
x22 | PUTS | 在屏幕上显示一个字符串,每个内存单元存放一个字符。 |
x23 | IN | 在屏幕上显示提示,读入一个字符,并在屏幕上显示该字符。 |
x24 | PUTSP | 在屏幕上显示一个字符串,每个内存单元存放两个字符。 |
x25 | HALT | 停止执行,并在屏幕上输出信息。 |
伪操作
.ORIG
.ORIG
告诉汇编器将程序放在内存的哪个位置。
.FILL
.FILL
占用一个地址,并往地址所指向的内存单元填充初始值。
.BLKW
.BLKW
占用连续的地址空间。
.STRINGZ
.STRINGZ
连续占用地址空间,并对其初始化,内存最后一个单元被置为x0000,类似C语言的/0。
.END
.END
源程序结束。
注释
DR
目的寄存器(destination register)。
SR
SR、SR1、SR2等等是指源寄存器(source register)。
BaseR
基址寄存器(Base Register),它和一个6-bit偏移相加产生Base+offset地址。
imm
立即数,# 表示十进制,X 表示十六进制,B 表示八进制。
LABEL
标号,指向内存单元的一个符号名,可以在程序中直接引用。
trapvect8
8-bit无符号整数,用于TRAP指令确定服务程序的入口地址,间接寻址模式,该地址的内存单元存放了服务程序的入口地址。
n z p
条件码,LC-3有三个位寄存器:N、Z和P,即负数(negative)、0(zero)和正数(positive),当任意寄存器被写入时,根据写入的是负数、0还是正数分别设置相应的条件码为1,其他为0。
![Logo](https://devpress.csdnimg.cn/79de2bf0b7994defa4242ef90d5513fa.jpg)
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)