首页 > 其他分享 >CSCI 2122翻译指令集

CSCI 2122翻译指令集

时间:2024-04-02 14:11:40浏览次数:27  
标签:编码 操作数 2122 rS CSCI rD 指令 指令集 寄存器

CSCI 2122任务4截止日期:2024年3月22日星期五晚上11:59,通过git提交目标本课业的目的是练习用C进行编码,并强化中讨论的概念关于程序表示的类。
在这个任务1中,您将实现一个二进制翻译器2,如Rosetta3。您的程序将从翻译一个简单的指令集(比x86简单得多)到x86并生成x86汇编代码。代码将然后通过组装和运行来进行测试。为了使任务更简单,将其分为两部分。在第一部分中,您将实现加载器和一个简单的翻译器,该翻译器翻译更简单的指令。在第二部分中,您将扩展翻译器以翻译更复杂的指令。准备1.完成工作分配0,或确保已安装完成工作分配所需的工具。2.克隆您的课业存储库:哪里是您的CSID。如果需要,请参阅课业0中的说明和Brightspace教程你不知道怎么做。在存储库中有一个目录:xtra,用于编写代码。目录中有一个tests目录,其中包含每次提交代码时将执行的测试。请不要修改测试目录或根目录中的.gitlab-ci.yml文件。正在修改这些文件可能会破坏测试。当分配完成时,这些文件将替换为原始文件分级。您将获得可用于构建程序的示例Makefile文件。如果你如果正在使用CLion,则将从CLion生成的CMakeLists.txt文件生成Makefile。

背景
对于这项任务,您将把简化的基于RISC的16位指令集中的二进制转换为x86-64装配具体地说X指令集包括少量(大约30条)指令,
其中大部分在大小上是两个字节(一个字)。X体系结构具有16位字大小和16个通用16位寄存器(r0…r15)。几乎所有指令对16位数据块进行操作。因此,所有值和地址的大小都是16位。全部16位值也以big-endian格式编码,这意味着最高有效字节位于第一位。除了16个通用寄存器外,该体系结构还有两个特殊的16位寄存器:一个程序计数器(PC),其存储将被执行的下一指令的地址和状态(F),其存储表示CPU状态的位标志。状态寄存器(F)的最低有效位是条件标志,表示最后一次逻辑测试操的真值。如果这个条件是真的,否则就是假的。
1这项任务的想法间接来自于凯尔?史密斯。
2.https://en.wikipedia.org/wiki/Binary_translation3.https://en.wikipedia.org/wiki/Rosetta_软件此外,CPU使用最后一个通用寄存器r15来存储指向程序堆栈的指针。当一个项从堆栈中弹出时,此寄存器将增加2,当一个项目被推到堆栈上。程序堆栈用于存储临时值、函数以及函数调用的返回地址。
X指令集
指令集包括大约30条指令,用于执行算术和逻辑、数据移动、堆栈操作和流控制。大多数指令以寄存器作为操作数并存储寄存器中运算的结果。但是,有些指令也将立即值作为操作数。因此,有四类指令:0操作数指令、1操作数指令,2操作数指令和扩展指令,它们采用两个字(4字节)而不是一个字。除了扩展指令之外的所有指令都被编码为单个字(16位)。扩展说明如下也是一个字,但后面跟着一个额外的一个字操作数。因此,如果指令是扩展的指令时,PC在指令执行期间需要2的额外增量。如前所述以前,大多数指令都被编码为一个单词。单词的最高有效两位指示指令是0操作数指令代 写CSCI 2122翻译指令集(00)、1操作数指令“01”还是2操作数指令(10)或扩展指令(11)。对于0操作数指令编码,两个最高有效位为00,接下来的六位表示指令标识符。这个指令的第二个字节是0。对于1操作数指令编码来说两个最高有效位是01,
下一位指示操作数是立即数还是寄存器,
并且接下来的五个比特表示指令标识符。如果第三多有效位为0,则第二个字节的四个最高有效位对要操作的寄存器进行编码(0…15)。否则,如果第三个最高有效位是1,那么第二个字节对立即值进行编码。对于2操作数指令编码,两个最高有效位为10,并且接下来的六个比特表示指令标识符。第二个字节编码
两个四位块中的两个寄存器操作数。每个4位块标识一个寄存器(r0…r15)。对于扩展指令编码,两个最高有效位是11,下一位指示是否使用第二寄存器操作数,以及接下来的五个比特表示指令标识符。如果第三多有效位为0,则指令仅使用指令后面的一个字立即数操作数。否则,如果第三个最高有效位是1,那么四个第二字节的最高有效位对作为第二操作数的寄存器(1…15)进行编码。指令集如表1、表2、表3和表4所示。每个描述都包括助记符(以及语法)、指令的编码、指令的描述和功能。例如,
loadi和push指令具有以下描述:
记忆编码描述函数
rS,rD 10000001 S D将寄存器rS添加到寄存器rD.rD← rD+rSloadi V,rD 11100001 D 0将立即值或地址V加载到寄存器rD。
rD← 内存[PC]
个人计算机← PC+2
将rS 01000011 S 0将寄存器rS推到程序堆栈上。r15← r15-2存储器[r15]← rS
首先,观察加法指令取两个寄存器操作数,并将第一个寄存器与第二个寄存器相加。所有2操作数指令仅在寄存器上操作,第二个寄存器既是源,又是目的地,而第一个是源。它是一条2操作数指令;因此前两位是10,其指令标识符是000001,因此指令的第一个字节是0x81。其次,loadi指令是一条扩展指令,它采用16位立即数并将其存储在登记因此,前两位为11,寄存器位设置为1,指令标识符为00001。因此,第一个字节被编码为0xE1。
第三,push指令是一条1操作数指令,取单个寄存器操作数。因此,第一两个位为01,立即数位为0,指令标识符为00011。因此,第一个字节是编码为0x43。
注意,S和D是表示S和D的4位矢量。
表1:0-操作数指令
记忆编码描述函数
ret 0000000 1 0从过程调用返回。P C← 存储器[r15]r15← r15+2
cld 00000010 0停止调试模式请参阅下面的调试模式。std 00000011 S 0启动调试模式请参阅下面的调试模式。表1:1-操作数指令
记忆编码描述函数
否定rD 01000001 D 0否定寄存器rD。rD← ?rD而不是rD 01000010 D 0逻辑否定寄存器rD。rD←!rDinc rD 01001000 D 0增量rD。rD← rD+1dec rD 01001001 D 0递减rD。rD← rD–1将rS 01000011 S 0将寄存器rS推到程序堆栈上。r15← r15–2存储器[r15]← rS
pop rD 01000100 D 0将堆栈中的值放入寄存器rD.rD← 存储器[r15]r15← r15+2
out rS 01000111 S 0将rS中的字符输出到std-out。输出← rS(见下文)br L 01100001 L如果条件位为,则相对于标签L的分支是的。
如果F&0x0001==0x001:
个人计算机← PC+L–2
jr L 01100010 L相对于标签L.PC的跳跃← PC+L–2表3:2-操作数指令
记忆编码描述函数
将寄存器rS加到寄存器rD。rD← rD+rS
sub rS,rD 10000010 S D从寄存器rD.rD减去寄存器rS← rD-rSmul rS,rD 10000011 S D将寄存器rD乘以寄存器rS.rD← rD*rS以及rS、rD 10000101 S D和寄存器rS与寄存器rD。rD← rD和rS或rS、rD 10000110 S D或寄存器rS与寄存器rD。rD← rD|rSxor rS、rD 10000111 S D X或寄存器rS与寄存器rD。rD← rD^rStest rS1,rS2 10001010 S D将条件标志设置为true当且仅当rS1∧rS2不是0。
如果rS1&rS2!=0:
F← F|0x0001
其他的
F← &0xFFFE
cmp rS1,rS2 10001011 S D将条件标志设置为true当且仅当rS1<rS2。
如果rS1<rS2:
F← F|0x0001
其他的
F← &0xFFFE
equ rS1,rS2 10001100 S D将条件标志设置为true当且仅当rS1==rS2。
如果rS1==rS2:
F← F|0x0001
其他的
F← &0xFFFE
mov rS、rD 10001101 S D将寄存器rS复制到寄存器rD。rD← rS加载rS,rD 10001110 SD将字从存储器加载到寄存器rD由寄存器rS指向。
rD← 内存[rS]
stor rS,rD 10001111 SD将字从寄存器rS存储到存储器寄存器r中的地址。
内存[rD]← rS
loadb rS,rD 10010000 SD将字节从存储器加载到寄存器rD由寄存器rS指向。
rD← (字节)内存[rS]
storb rS,rD 10010001 S D将字节从寄存器rS存储到存储器寄存器r中的地址。
(字节)内存[rD]
愿望,直到最后期限。每次提交时,都会执行功能测试,您可以查看测试结果。若要提交,请使用与分配0相同的过程。
分级
如果你的程序没有编译,它将被视为不起作用且质量极差,这意味着你将收到0的解决方案。课业将根据三个标准进行评分:
功能:“它是否按照规范工作?”。这是通过以下自动方式确定的在多个输入上运行程序,并确保输出与预期输出匹配。这个分数是根据你的程序通过的测试次数来确定的。所以,如果你的程序通过了t/t测试,您将获得该比例的分数。
解决方案质量:“这是一个好的解决方案吗?”这考虑了您的方法和算法解决方案是正确的。这是通过目视检查代码来确定的。有可能取得好成绩在这方面,即使您有导致代码无法通过某些测试的错误。代码清晰度:“它写得好吗?”这考虑了解决方案是否正确格式化、文档记录良好以及是否遵循编码风格准则。为了清晰起见,将指定一个整体标记。请参阅Brightspace课程课业部分的风格指南。
将使用以下分级方案:任务100%80%60%40%20%0%
功能
未提交课业测试
通过提交进行测试可能需要一些时间,尤其是在加载了服务器的情况下。您可以在没有使用提供的runtests.sh脚本提交代码。运行不带参数的脚本将运行所有测试。运行测试编号为00、01、02、03…09的脚本将运行特定的测验请参阅下面的脚本运行方式。
准备好程序运行
如果您直接在unix服务器上进行开发,
1.通过SSH连接到远程服务器,并确保您在xtra目录中。2.确保程序是通过运行make编译的。
如果您正在使用CLion
1.如CLion教程中所述,在远程服务器上运行程序。2.通过工具打开远程主机终端→ 打开远程主机终端
如果您正在使用VSCode
1.如VSCode教程中所述,在远程服务器上运行程序。2.单击窗口下半部分的“终端”窗格或通过“终端”→ 新建终端运行脚本
3.使用以下命令在终端中运行脚本:
./runtest.sh
运行所有测试,或指定运行特定测试的测试编号,例如:./runtest.sh 07
您将在终端窗口中看到测试运行。
X汇编程序(xas)
提供了一个汇编程序(xas),允许您为X体系结构编写和编译程序。到制作汇编程序,只需在xtra目录中运行“make-xas”即可。要运行汇编程序,请指定程序集和可执行文件。例如
./xas example.xas example.xo将X程序集文件example.xas汇编为X可执行文件example.xo。程序集文件的格式很简单。
1.任何位于#标记右侧的内容,包括#,都将被视为注释并被忽略。2.忽略空行。
3.程序集文件中非空的每一行都必须包含一个指令、一个标签和/或一条指令。如果行同时包含标签和指令,则标签必须位于第一位。4.标签的形式
标识符:
其中标识符由任意长度的字母(A-Za-z)、数字(0-9)或下划线()序列组成第一个字符不是数字。冒号(:)必须终止标签。标签表示程序中的相应位置,并可用于跳转到代码中的那个位置。5.指令由助记符组成,如add、loadi、push等,后面跟零或更多操作数。操作数必须与助记符用一个或多个空格分隔。
多个操作数用逗号分隔。
6.如果操作数是寄存器,则其形式必须为r#,其中#的范围介于0和15之间(包括0和15)。例如,r13。7.如果指令是立即数,那么自变量可以是标签,也可以是整数。笔记标签区分大小写。如果指定了标签,则标签后面不应该有冒号。8.指令指示汇编程序执行特定的功能或以特定的方式表现。所有指令都以句点开头,后面跟一个关键字。有三个指令:.literal、.words和.glob,每个指令都接受一个操作数。(a) .literal指令当前编码以null结尾的字符串或整数程序中的位置。例如。,
mystring:
.字面意思是“你好,世界!”
myvalue:
.文字42
对后面跟有表示十进制值42的16位(1个字)值的以零结尾的字符串进行编码。在本例中,每个编码之前都有标签,因此很容易访问这些文字。也就是说,标签mystring表示字符串编码的地址(相对于程序的开始),标签myvalue表示值的地址(相对于程序的开始)。此用于
hello.xas示例。
(b) .words指令当前留出指定数量的内存单词程序中的位置。例如。,
myspace:
.单词6
在程序的当前点分配6个字的内存。此空间未初始化为任何特定值。和以前一样,指令前面的标签表示相对于程序开始的第一个单词的地址。这在xrt0.xas中用于为程序堆栈留出空间。
(c) .glob指令导出指定的符号(标签)(如果在文件中定义),并且如果指定的符号(标签)已使用但未在文件中定义,则导入该符号。例如。,.glob foo
.glob条
...
loadi bar,r0
...
foo:
.字面意思是“你好,世界!”
声明了两个符号(标签)foo和bar。符号foo是在这个文件中声明的,所以它将在其他文件中导出(可以访问)。使用后一个符号bar,但不使用定义。链接此文件时,链接器在中查找符号(标签)定义其他文件使对符号的所有引用都指向定义符号的位置。注意:建议您将文字和所有空间分配放在程序的末尾,因此它们不会干扰程序本身。如果你确实把文字放在程序的中间,你将需要确保您的代码绕过这些分配。
提供了几个示例程序集文件(以.xas结尾)。您可以通过调用来组装它们汇编程序,例如:./xas example.xas example.xo此调用将导致汇编程序读入example.xas文件并生成输出文件example.xo。请随意查看汇编程序的代码。

标签:编码,操作数,2122,rS,CSCI,rD,指令,指令集,寄存器
From: https://www.cnblogs.com/meryo/p/18110453

相关文章

  • CSci 4061多线程图像匹配服务器
    CSci4061:操作系统简介,2024年春季项目#3:多线程图像匹配服务器中间提交截止时间:2023年4月4日下午11:59(CDT)最终提交截止时间:下午11:59(CDT),4。12,20231.背景这个实验室的目的是使用C语言中的POSIX线程(pthreads)来学习线程编程和同步方法。在这个项目中,我们将使用多线程来提高服务器的......
  • CSci 4061 增强型自动平地机
    CSci4061:操作系统简介2024年春季项目2:增强型自动平地机中间到期时间:3/15午夜1.目标在这个项目中,你将通过多种方式扩展/增强你的自动标记。你将使用管道(管道)在自动转换器及其子级(可执行文件)之间通信信息,2)使用I/O重定向(dup2)和随机I/O(seek),3)使用消息传递队列来实现差异,并使用警报......
  • CSCI 2122实现二进制翻译器
    CSCI2122任务4截止日期:2024年3月22日星期五晚上11:59,通过git提交目标本课业的目的是练习用C进行编码,并强化中讨论的概念关于程序表示的类。在这个任务1中,您将实现一个二进制翻译器2,如Rosetta3。您的程序将从翻译一个简单的指令集(比x86简单得多)到x86并生成x86汇编代码。代码将......
  • 嵌入式笔记1.2 ARM Cortex-M3M4汇编指令集
    目录Cortex-M处理器的指令集Cortex-M处理器支持的指令集Cortex-M处理器指令集的选择寄存器组详解1.通用寄存器R0~R122.栈指针3.连接寄存器4.程序计数寄存器5.程序状态字寄存器(xPSR)6.特殊功能寄存器7.浮点控制寄存器指令集详解(Cortex-M3和Cortex-M4都支持的)1.处理......
  • CSCI 5708移动计算
    CSCI4176/CSCI5708移动计算截止日期:2023年11月14日星期日下午11点59分提交:在Brightspace请阅读-所有课业的一般重要说明:•对于要求您进行在线搜索的研究类型ques/ons或ques/ons,请确保您的答案中正确引用了所有参考文献。使用IEEE参考样式。•请记住,不能仅仅因为引用了参考文......
  • CSCI 2122 C语言进行编码
    CSCI2122任务4截止日期:2024年3月22日星期五晚上11:59,通过git提交目标本作业的目的是练习用C语言进行编码,并强化课堂上讨论的程序表示概念。在这个任务1中,您将实现一个类似Rosetta3的二进制翻译器2。您的程序将从一个简单的指令集(比x86简单得多)转换为x86,并生成x86汇编代码。然......
  • cass-3-常见修改指令集
    Eerase删除(擦除)实体选中实体,输入e,空格确认ooffset偏移输入offset,输入偏移量,选中实体,会出现预览偏移,点击确定选中实体之后的操作可以重复操作选中线时,属于平移操作但要注意的是这个本质上也是放大和缩小选中闭合面时候,属于向内缩小或者向外放大mmove移动......
  • 20212217刘恒谦-Exp2 后门原理与实践
    实践过程记录使用netcat获取主机操作Shell,cron启动​ ncat即Netcat,可以收发传输层数据,由攻击者使用。cron是Linux中用于按计划执行脚本的工具,在网络对抗中让受害者连接不稳定时,重连攻击者,由受害者启动。​ 既然如此,受害者需要是Linux,否则没有cron命令,我购买了一台阿里云Ubuntu......
  • 【工程应用九】再谈基于离散夹角余弦相似度指标的形状匹配优化(十六角度量化+指令集加
    继去年上半年一鼓作气研究了几种不同的模版匹配算法后,这个方面的工作基本停滞了有七八个月没有去碰了,因为感觉已经遇到了瓶颈,无论是速度还是效率方面,以当时的理解感觉都到了顶了。年初,公司业务惨淡,也无心向佛,总要找点事情做一做,充实下自己,这里选择了前期一直想继续研究的基于......
  • 发布 VectorTraits v2.0(支持 x86的Sse系列指令集等)
    目录支持x86的Sse系列指令集为Vector128/Vector256补充全部的向量方法提供CPU型号信息结果范例1:X86CPUonWindows结果范例2:ArmCPUonLinux结果范例3:ArmCPUonMacOS提供所支持的指令集信息结果范例1:X86CPUonWindows结果范例2:ArmCPUonLinux结果范例3:Arm......