国产人妻人伦精品_欧美一区二区三区图_亚洲欧洲久久_日韩美女av在线免费观看

合肥生活安徽新聞合肥交通合肥房產(chǎn)生活服務(wù)合肥教育合肥招聘合肥旅游文化藝術(shù)合肥美食合肥地圖合肥社保合肥醫(yī)院企業(yè)服務(wù)合肥法律

CS 2210編程代寫、Java程序語言代做

時間:2023-11-27  來源:合肥網(wǎng)hfw.cc  作者:hfw.cc 我要糾錯



CS 2210 Programming Project (Part IV)
Code Generation
This project is intended to give you experience in writing a code generator as well as bring together
the various issues of code generation discussed in the text and in class.
Due date
The assignment is due December 9th, 2023, 11:59pm. This is the hard deadline and no extensions will be given for this project.
Project Summary
Your task is to write a code generator, the final phase of your compiler. It produces (target)
assembly code for the MIPS R2000 architecture. It takes as input the augmented AST and symbol
table produced by the previous phases of your compiler. The generated code will be executed using
SPIM S20, a simulator for the MIPS R2000.
Code generation will consist of assigning memory addresses for each variable used in the MINIJAVA program and translating subtrees of the AST (intermediate language representation) into
sequences of assembly instructions that perform the same task.
Code Generation
This is the only phase of your compiler which is machine dependent. Examples of assembly code
programs will be provided on the class webpage.
The important/interesting issues in generating code for MINI-JAVA are discussed in the following paragraphs. Please refer to chapter 7, 8 and class notes for further details on these issues,
You can make the following assumptions to simplify the project.
ˆ Code is generated for the intermediate instructions on a statement-by-statement basis without
taking into account the context of an intermediate instruction
ˆ code is generated for the intermediate instructions in the order that they occur within the
intermediate instruction sequence.
ˆ You may take advantage of any special instruction of the machine when choosing target
instructions for a given intermediate instruction.
ˆ You do not have to any fancy register allocation or optimization on your target code.
1
Computing Memory Addresses
Since address information has not been computed and entered into the symbol table by earlier
phases, the first task of the code generator is to compute the offsets of each variable name (both
global and local); that is, the address of each local data object and formal parameter within the
activation record for the block in which they are declared. This can be done by initializing a
variable offset at the start of each declaration section, and as each declaration is processed, the
current value of offset is entered as an attribute of that symbol, and offset is then incremented
by the total width of that data object (depending on its type).
The program execution begins with a method called main() being called. Since the language
has no way to initiate classes, all classes are instantiated when program execution begins. Thus,
all storage for all classes is allocated globally. The offsets of variables within classes should be
computed and stored as an attribute of the variable name, typically relative to the start of the class
or can just be relative to the start of the global storage.
For simplicity, declarations within a method donot contain any objects whose types are classes.
That is, local variables can only be of integer type or integer array type.
Call-by-value parameters will have a width dependent on the type of the parameter (remember
we are using only integer parameters), whereas call-by-reference parameters will have a width
equal to ONE word to store an address. The total activation record size of each method should be
computed at this time and entered in the symbol table as an attribute of the method name.
The machine architecture must be take into account when computing these widths, that is,
an integer in the MIPS processor is 4 bytes. Offsets of locals can be implemented as a negative
offset from the frame pointer while offsets of parameters can be positive from the frame pointer.
Thus, the computation of offsets of arguments and local variables can be done independently. This
information will be used upon every reference to the data object in addition to being used in the
allocation of storage for activation records.
Handling Structure Data Types
Storage for an array is allocated as a consecutive block of memory. Access to individual elements
of an array is handled by generating an address calculation using the base address of the array,
the index of the desired element, and the size of the elements. You are free to choose the layout of
elements of an array in your implementation (e.g., row major or column major order).
Simple Control Flow
Code for simple control statements, namely conditional and loops in MINI-JAVA, can be generated
according to the semantics of conventional programming languages using the compare and branch
instructions of the assembly language. Unique target labels will also have to be generated.
Method Invocation, Prologues, and Epilogues
Recursion in MINI-JAVA prevents the use of a static storage allocation strategy. However, the
language has no features that prevent the deallocation of activation records in a last-in-first-out
manner. That is, activation records containing data local to an execution of a method, actual
parameters, saved machine status, and other information needed to manage the activation of the
2
method can be stored on a run-time stack. The MIPS assembly language provides the subroutine
call mechanisms to manipulate the run-time user stack.
An activation record for a method is pushed onto the stack upon a call to that method, while
the activation record for the method is popped from the stack when execution of the method is
finished and control is to be returned to the caller. As MINI-JAVA does not allow dynamic classes
and arrays, the sizes of all activation records are known at compile time.
Method calls result in the generation of a calling sequence. Upon a call, an activation record for
the callee must be set up and control must be transferred to the callee after saving the appropriate
information in the activation record. For each method, the generated code sequence will consist of
a prologue, the code for the statements of the method, and the epilogue. Typically, the prologue
saves the registers upon a method call and allocates space on the stack for local variables, whereas
the epilogue consists of restoring the saved machine status and returning control to the point in the
caller immediately after the point of call. The handout on the MIPS assembly language explains
the instructions used to implement these actions.
Parameter passing
In order to correctly handle the formal parameters within the body of the callee, the symbol table
entry for each formal parameter must include an attribute that indicates the parameter passing
mode, that is, by-value or by-reference. Remember that we do not pass arrays as parameters. On
a method invocation, call-by-value parameters are handled by allocating the local store for the size
of the object in the activation record of the callee and then evaluating the actual parameter and
initializing the local store within the callee with the value of the actual parameter. All accesses to
that formal parameter will change the value in the local space, with no effect on the caller. On a
return, no values are copied back to the caller.
Call-by-reference parameters are handled by allocating local space in the callee’s activation
record for the address of the actual parameter and then copying the address of the actual parameter
into that local space. All accesses to that formal parameter during execution of the callee are indirect
accesses through this address, having a direct effect on the caller. On return, no action is taken
other than reclaiming the space.
Note that MIPS has a convention that the first 4 arguments of a method call are passed in
register $a0-$a3. You have the option to follow this convention.
Register Usage
In the MIPS processor, certain registers are typically reserved for special purposes. You should
abide by these conventions.
Possible Functions
You may want to write the following functions to help in the code generation.
1. emit call(func name, num arg)/*emit a call instruction; func name: function id lexeme pointer;
num arg: number of arguments */
2. emit label(l num)/*emit a definition of a label; l num: label number; example: L=102, code
generated = “L 102” */
3
3. emit goto(operator, l num) /*emit unconditional and conditional jump instructions; operator:
an operator in the branch-jump group; l num: label number */
4. emit data(name, type, size) /* emit one data line, which is used for STATIC allocation;
name: data object id lexeme pointer; type: type width; size: number of elements of above type
*/
5. emit str(name, str) /* emit a string constant definition line; name: pointer to the name
lexeme; str: pointer to the str */
6. emit most(operator, type, num op, op1, op2, op3) /* emit most of the instructions; operator:
one of the instructions in the general group; type: data type; num op: number of operators 1,
2 and/or 3; op1...3: operands, op2 and op3 can be omitted depending on num op */
Run-time Error Detection
You do not need to generate any run-time checks. Thus you can assume that array bounds are
within range and scalars are within range.
Testing your code
The code generated is MIPS assembly code and should follow the descriptions specified in the
handout SPIM S20. Samples will be put on the class webpage.
You can run the generated assembly code on the simulator and check the results. However, the
correct output does not guarantee that your code is completely correct. You should examine your
generated code carefully.
proj4> codeGen < sample1.java
proj4> spim -asm -file code.s
... ...
or
proj4> spim
(spim) load “code.s”
(spim) step
[0x00400000] 0x8fa40000 lw $4,0($29)
(spim) run
... ...
Assignment submission
Please submit your project in Canvas before the due time. The submission should be a compressed
file that contains your project source code and readme file (if any).
請加QQ:99515681 或郵箱:99515681@qq.com   WX:codehelp

掃一掃在手機(jī)打開當(dāng)前頁
  • 上一篇:代寫CSC3100 Data Structures
  • 下一篇:CSCC43代做、R設(shè)計編程代寫
  • 無相關(guān)信息
    合肥生活資訊

    合肥圖文信息
    流體仿真外包多少錢_專業(yè)CFD分析代做_友商科技CAE仿真
    流體仿真外包多少錢_專業(yè)CFD分析代做_友商科
    CAE仿真分析代做公司 CFD流體仿真服務(wù) 管路流場仿真外包
    CAE仿真分析代做公司 CFD流體仿真服務(wù) 管路
    流體CFD仿真分析_代做咨詢服務(wù)_Fluent 仿真技術(shù)服務(wù)
    流體CFD仿真分析_代做咨詢服務(wù)_Fluent 仿真
    結(jié)構(gòu)仿真分析服務(wù)_CAE代做咨詢外包_剛強(qiáng)度疲勞振動
    結(jié)構(gòu)仿真分析服務(wù)_CAE代做咨詢外包_剛強(qiáng)度疲
    流體cfd仿真分析服務(wù) 7類仿真分析代做服務(wù)40個行業(yè)
    流體cfd仿真分析服務(wù) 7類仿真分析代做服務(wù)4
    超全面的拼多多電商運(yùn)營技巧,多多開團(tuán)助手,多多出評軟件徽y1698861
    超全面的拼多多電商運(yùn)營技巧,多多開團(tuán)助手
    CAE有限元仿真分析團(tuán)隊,2026仿真代做咨詢服務(wù)平臺
    CAE有限元仿真分析團(tuán)隊,2026仿真代做咨詢服
    釘釘簽到打卡位置修改神器,2026怎么修改定位在范圍內(nèi)
    釘釘簽到打卡位置修改神器,2026怎么修改定
  • 短信驗證碼 寵物飼養(yǎng) 十大衛(wèi)浴品牌排行 suno 豆包網(wǎng)頁版入口 目錄網(wǎng) 排行網(wǎng)

    關(guān)于我們 | 打賞支持 | 廣告服務(wù) | 聯(lián)系我們 | 網(wǎng)站地圖 | 免責(zé)聲明 | 幫助中心 | 友情鏈接 |

    Copyright © 2025 hfw.cc Inc. All Rights Reserved. 合肥網(wǎng) 版權(quán)所有
    ICP備06013414號-3 公安備 42010502001045

    国产人妻人伦精品_欧美一区二区三区图_亚洲欧洲久久_日韩美女av在线免费观看
    91九色在线观看| 中国丰满熟妇xxxx性| 国产日韩欧美日韩大片| 黄色小视频大全| 免费国产黄色网址| 国产视频一区二区三区在线播放| 成人精品一区二区三区| 国产性生交xxxxx免费| 精品一区二区三区毛片| 国产在线视频91| 国产欧美精品一区二区三区介绍 | 精品国产一区二区三区免费| 国产精品视频免费一区| 日韩视频免费中文字幕| 国产精品日本精品| 九九久久精品一区| 五月天色婷婷综合| 人人妻人人添人人爽欧美一区 | 亚洲一区二区三区sesese| 中文字幕中文字幕一区三区 | 日本在线视频www色| 日韩av影视| 欧美视频在线第一页| 美女被啪啪一区二区| 国产欧美精品一区二区三区| 91免费看片在线| 九九九热999| 精品伦精品一区二区三区视频| 国产精品揄拍500视频| av免费观看久久| 久久综合入口| 国产精品精品久久久久久| 亚洲午夜精品久久久中文影院av| 精品国产一区二区三区久久狼黑人| 精品视频导航| 成人国产精品av| 日韩最新av在线| 久久艳片www.17c.com| 亚洲第一精品区| 韩国福利视频一区| 久久综合婷婷综合| 久久成年人视频| 日本精品免费在线观看| 美国av一区二区三区| 久久视频在线观看中文字幕| 国产精品久久久久久av| 午夜精品久久久久久久99黑人 | 国产伦精品一区二区三区视频黑人| 少妇熟女一区二区| 欧美丰满熟妇xxxxx| 91精品国产综合久久男男| 日韩午夜在线视频| 伊人久久大香线蕉av一区| 欧美专区第一页| 古典武侠综合av第一页| 久久久成人av| 日韩aⅴ视频一区二区三区| 国产欧美日韩中文| 国产精品无码一区二区在线| 欧美一级片免费播放| 9a蜜桃久久久久久免费| 久久躁狠狠躁夜夜爽| 日韩精品一区中文字幕| 91精品视频观看| 在线观看国产一区| 国产综合 伊人色| 国产成人精品综合久久久| 性高潮久久久久久久久| 国产玖玖精品视频| 国产精品久久..4399| 日本精品在线视频| 国产精品91在线观看| 欧美激情区在线播放| 蜜臀av.com| 国产精品入口尤物| 青青草视频在线视频| 久久久久99精品成人片| 亚洲欧美国产一区二区| 国产免费一区二区三区在线观看| 国产欧美韩日| 按摩亚洲人久久| 日本一区二区在线| 国产国语videosex另类| 性欧美精品一区二区三区在线播放| 日本最新高清不卡中文字幕 | 国产伦一区二区三区色一情| 国产精品视频99| 黄色www在线观看| 国产精品免费一区二区三区都可以| 久久av中文字幕| 欧美日本韩国国产| xxxx性欧美| 欧美视频在线观看网站| 日韩亚洲国产中文字幕| 欧美在线日韩在线| 国产精品久久中文| 欧美成人精品免费| 国产精品视频不卡| 免费日韩中文字幕| 不卡av日日日| 国产精品有限公司| 亚洲国产精品久久久久婷蜜芽| 人妻无码久久一区二区三区免费| 国产精品海角社区在线观看| 黄色网页免费在线观看| 国产精品高潮视频| 国产乱子夫妻xx黑人xyx真爽| 国产高清精品在线观看| 日产精品高清视频免费| 久久国产精品 国产精品| 日本一本草久p| 久久久久久精| 欧美福利精品| 欧美精品成人在线| 久久手机在线视频| 欧美福利精品| 九九热精品视频| 131美女爱做视频| 欧美在线视频免费| 欧美日韩成人黄色| 久久综合色一本| 黄色大片在线免费看| 一区二区精品免费视频| 久久久久久久电影一区| 国内自拍在线观看| 亚洲综合在线播放| 久久久久久亚洲| 国产精品综合网站| 奇米一区二区三区四区久久| 精品国产乱码久久久久久88av| 欧美日韩亚洲免费| 国产精品久久久久久久久久久久冷| 污污污污污污www网站免费| 久久综合亚洲精品| 激情五月开心婷婷| 亚洲综合五月天| 色狠狠av一区二区三区香蕉蜜桃| 亚洲精品一区二区三区樱花| 国产成人综合一区| 国产日韩在线一区| 日韩伦理一区二区三区av在线| 成人国产精品久久久久久亚洲| 国产精品久久久久久久久久新婚 | 青青草国产精品一区二区| 国产精品入口尤物| 69av视频在线播放| 国产女主播一区二区| 欧美伊久线香蕉线新在线| 亚洲影视九九影院在线观看| 久久久999成人| 97精品久久久中文字幕免费| 日韩欧美在线一区二区| 国产精品大全| 久久久久久久久国产精品| 国产精品永久免费视频| 欧美精品第三页| 日本精品视频在线| 综合色婷婷一区二区亚洲欧美国产| 国产在线视频欧美一区二区三区| 久久久噜久噜久久综合| 国产欧美在线观看| 欧美精品99久久| 日本高清一区| 午夜精品一区二区三区在线| 久久视频这里只有精品| 久久精品国产sm调教网站演员| 日本午夜在线亚洲.国产| 久久亚洲精品视频| 久热精品视频在线| 日韩视频在线观看免费| 99久久久精品视频| 国产日韩在线观看av| 精品嫩模一区二区三区| 日韩精品一区中文字幕| 亚洲日本精品国产第一区| 精品国产一区二区三区四区vr| 国产主播喷水一区二区| 日本免费在线精品| 亚洲中文字幕无码av永久| 精品成在人线av无码免费看| 国产精品嫩草影院久久久| 久久久亚洲天堂| 8050国产精品久久久久久| 97国产精品视频| www国产无套内射com| 国产狼人综合免费视频| 丰满人妻中伦妇伦精品app| 国产欧美日韩中文| 国产精品一区二区三区在线观| 亚洲一区二区三区精品视频 | 99精品欧美一区二区三区| 国产日产欧美视频| 狠狠色噜噜狠狠色综合久 | 国产精品人人妻人人爽人人牛| 免费久久99精品国产自| 欧美精品欧美精品| 精品日本一区二区| 国产又粗又爽又黄的视频| 蜜桃视频日韩| 国产精品永久免费观看|