99爱在线视频这里只有精品_窝窝午夜看片成人精品_日韩精品久久久毛片一区二区_亚洲一区二区久久

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

CSCI 2122代寫、代做C/C++編程語(yǔ)言

時(shí)間:2024-03-28  來(lái)源:合肥網(wǎng)hfw.cc  作者:hfw.cc 我要糾錯(cuò)



CSCI 2122 Assignment 4
Due date: 11:59pm, Friday, March 22, 2024, submitted via git
Objectives
The purpose of this assignment is to practice your coding in C, and to reinforce the concepts discussed in
class on program representation.
In this assignment1 you will implement a binary translator2 like Rosetta3
. Your program will translate from
a simple instruction set (much simpler than x86) to x86 and generate x86 assembly code. The code will
then be tested by assembling and running it. This assignment is divided into two parts to make it simpler.
In the first part, you will implement the loader and a simple translator, which translates the simpler instructions. In the second part, you will extend the translator to translate more complex instructions.
Preparation:
1. Complete Assignment 0 or ensure that the tools you would need to complete it are installed.
2. Clone your assignment repository:
https://git.cs.dal.ca/courses/2024-winter/csci-2122/assignment-4/????.git
where ???? is your CSID. Please see instructions in Assignment 0 and the tutorials on Brightspace if
you are not sure how.
Inside the repository there is one directory: xtra, where code is to be written. Inside the directory is a
tests directory that contains tests that will be executed each time you submit your code. Please do not
modify the tests directory or the .gitlab-ci.yml file that is found in the root directory. Modifying
these files may break the tests. These files will be replaced with originals when the assignments are
graded. You are provided with sample Makefile files that can be used to build your program. If you
are using CLion, a Makefile will be generated from the CMakeLists.txt file generated by CLion.
Background:
For this assignment you will translate a binary in a simplified RISC-based 16-bit instruction set to x86-64
assembly. Specifically, the X instruction set comprises a small number (approximately 30) instructions,
most of which are two bytes (one word) in size.
The X Architecture has a 16-bit word-size and 16 general purpose 16-bit registers (r0 . . . r15 ). Nearly all
instructions operate on 16-bit chunks of data. Thus, all values and addresses are 16 bits in size. All 16-bit
values are also encoded in big-endian format, meaning that the most-significant byte comes first.
Apart from the 16 general purpose registers, the architecture has two special 16-bit registers: a program
counter (PC), which stores the address of the next instruction that will be executed, and the status (F),
which stores bit-flags representing the CPU state. The least significant bit of the status register (F) is the
condition flag, which represents the truth value of the last logical test operation. The bit is set to true if
the condition was true, and to false otherwise.
1 The idea for this assignment came indirectly from Kyle Smith.
2 https://en.wikipedia.org/wiki/Binary_translation
3 https://en.wikipedia.org/wiki/Rosetta_(software)
Additionally, the CPU uses the last general-purpose register, r15, to store the pointer to the program stack.
This register is incremented by two when an item is popped off the stack and decremented by two when
an item is pushed on the stack. The program stack is used to store temporary values, arguments to a
function, and the return address of a function call.
The X Instruction Set
The instruction set comprises approximately 30 instructions that perform arithmetic and logic, data movement, stack manipulation, and flow control. Most instructions take registers as their operands and store
the result of the operation in a register. However, some instructions also take immediate values as operands. Thus, there are four classes of instructions: 0-operand instructions, **operand instructions, 2-operand instructions, and extended instructions, which take two words (4 bytes) instead of one word.
All but the extended instructions are encoded as a single word (16 bits). The extended instructions are
also one word but are followed by an additional one-word operand. Thus, if the instruction is an extended
instruction, the PC needs an additional increment of 2 during the instruction’s execution. As mentioned
previously, most instructions are encoded as a single word. The most significant two bits of the word
indicates whether the instruction is a 0-operand instruction (00), a **operand instruction (01), a 2-operand
instruction (10), or an extended instruction (11). For a 0-operand instruction encoding, the two most significant bits are 00 and the next six bits represent the instruction identifier. The
second byte of the instruction is 0.
For a **operand instruction encoding, the two most significant bits are 01,
the next bit indicates whether the operand is an immediate or a register,
and the next five bits represent the instruction identifier. If the third most
significant bit is 0, then the four most significant bits of the second byte
encode the register that is to be operated on (0… 15). Otherwise, if the third most significant bit is 1, then
the second byte encodes the immediate value.
For a 2-operand instruction encoding, the two most significant bits are 10, and
the next six bits represent the instruction identifier. The second byte encodes
the two register operands in two four-bit chunks. Each of the 4-bit chunks identifies a register (r0 … r15).
For an extended instruction encoding, the two most significant bits are
11, the next bit indicates whether a second register operand is used, and
the next five bits represent the instruction identifier. If the third most
significant bit is 0, then the instruction only uses the one-word immediate operand that follows the instruction. Otherwise, if the third most significant bit is 1, then the four
most significant bits of the second byte encode a register (1 … 15) that is the second operand.
The instruction set is described in Tables 1, 2, 3, and 4. Each description includes the mnemonic (and
syntax), the encoding of the instruction, the instruction’s description, and function. For example, the add,
loadi, and push instructions have the following descriptions:
Mnemonic Encoding Description Function
add rS, rD 10000001 S D Add register rS to register rD. rD ← rD + rS
loadi V, rD 11100001 D 0 Load immediate value or address V into
register rD.
rD ← memory[PC]
PC ← PC + 2
push rS 01000011 S 0 Push register rS onto program stack. r15 ← r15 - 2
memory[r15 ] ← rS
First, observe that the add instruction takes two register operands and adds the first register to the second. All 2-operand instructions operate only on registers and the second register is both a source and
destination, while the first is the source. It is a 2-operand instruction; hence the first two bits are 10, its
instruction identifier is 000001 hence the first byte of the instruction is 0x81.
Second, the loadi instruction is an extended instruction that takes a 16-bit immediate and stores it in a
register. Hence, the first two bits are 11, the register bit is set to 1, and the instruction identifier is 00001.
Hence, the first byte is encoded as 0xE1.
Third, the push instruction is a **operand instruction, taking a single register operand. Hence, the first
two bits are 01, the immediate bit is 0, and the instruction identifier is 00011. Hence, the first byte is
encoded as 0x43.
Note that S and D are 4-bit vectors representing S and D.
Table 1: 0-Operand Instructions
Mnemonic Encoding Description Function
ret 00000001 0 Return from a procedure call. P C ← memory[r15 ]
r15 ← r15 + 2
cld 00000010 0 Stop debug mode See Debug Mode below.
std 00000011 S 0 Start debug mode See Debug Mode below.
Table 1: **Operand Instructions
Mnemonic Encoding Description Function
neg rD 01000001 D 0 Negate register rD . rD ← −rD
not rD 01000010 D 0 Logically negate register rD . rD ←!rD
inc rD 01001000 D 0 Increment rD . rD ← rD + 1
dec rD 01001001 D 0 Decrement rD . rD ← rD – 1
push rS 01000011 S 0 Push register rS onto the pro- gram stack. r15 ← r15 – 2
memory[r15] ← rS
pop rD 01000100 D 0 Pop value from stack into register rD. rD ← memory[r15 ]
r15 ← r15 + 2
out rS 01000111 S 0 Output character in rS to std- out. output ← rS (see below)
br L 01100001 L Branch relative to label L if condition bit is
true.
if F & 0x0001 == 0x001:
 PC ← PC + L – 2
jr L 01100010 L Jump relative to label L. PC ← PC + L – 2
Table 3: 2-Operand Instructions
Mnemonic Encoding Description Function
add rS , rD 10000001 S D Add register rS to register rD . rD ← rD + rS
sub rS , rD 10000010 S D Subtract register rS from register rD. rD ← rD - rS
mul rS , rD 10000011 S D Multiply register rD by register rS. rD ← rD * rS
and rS , rD 10000101 S D And register rS with register rD . rD ← rD & rS
or rS , rD 10000110 S D Or register rS with register rD . rD ← rD | rS
xor rS , rD 10000111 S D Xor register rS with register rD . rD ← rD ^ rS
test rS1, rS2 10001010 S D Set condition flag to true if and only if
rS1 ∧ rS2 is not 0.
if rS1 & rS2 != 0:
 F ← F | 0x0001
else:
 F ← F & 0xFFFE
cmp rS1, rS2 10001011 S D Set condition flag to true if and only If
rS1 < rS2.
if rS1 < rS2:
 F ← F | 0x0001
else:
 F ← F & 0xFFFE
equ rS1, rS2 10001100 S D Set condition flag to true if and only if
rS1 == rS2.
if rS1 == rS2:
 F ← F | 0x0001
else:
 F ← F & 0xFFFE
mov rS , rD 10001101 S D Copy register rS to register rD . rD ← rS
load rS , rD 10001110 S D Load word into register rD from memory
pointed to by register rS.
rD ← memory[rS]
stor rS , rD 10001111 S D Store word from register rS to memory at
address in register rD.
memory[rD] ← rS
loadb rS , rD 10010000 S D Load byte into register rD from memory
pointed to by register rS.
rD ← (byte)memory[rS]
storb rS , rD 10010001 S D Store byte from register rS to memory at
address in register rD.
(byte)memory[rD] ← rS
Table 3: Extended Instructions
Mnemonic Encoding Description Function
jmp L 11000001 0 Absolute jump to label L. PC ← memory[PC]
call L 11000010 0 Absolute call to label L.. r15 ← r15 – 2
memory[r15] ← PC + 2
PC ← memory[PC]
loadi V, rD 11100001 D 0 Load immediate value or address V into
register rD.
rD ← memory[PC]
PC ← PC + 2
Note that in the case of extended instructions, the label L or value V are encoded as a single word (16-bit
value) following the word containing the instruction. The 0 in the encodings above represents a 4-bit 0
vector.
An assembler is provided for you to use (if needed). Please see the manual at the end of the assignment.
The Xtra Translation Specification (IMPORTANT)
The binary translation is conducted in the following manner. The translator
1. Opens the specified file containing the X binary code.
2. Outputs a prologue (see below), which will be the same for all translations.
3. It then enters a loop that
a. Reads the next instruction from the binary
b. Decodes the instruction, and
c. Outputs the corresponding x86 assembly instruction(s). If the instruction is an extended,
an additional two bytes will need to be read.
d. The loop exits when the instruction composed of two 0 bytes is read.
4. Outputs an epilogue.
Prologue
The translator first outputs a simple prologue that is the same
for all translations. The prologue is shown on the right.
Epilogue
After the translator finishes translating, it outputs a simple epilogue that is the same for all translations. The epilogue is
shown on the right.
Translation
Each X instruction will need to be translated into
the corresponding instruction or instructions in
x86-64 assembly. See table on right for examples.
Most instructions will have a direct corresponding
instruction in x86 assembly so the translation will
be easy. Some instructions, like the equ, test, and cmp, instructions
may require multiple x86 instructions for a single X instruction.
Note: The translator will need to perform a register mapping.
Register Mapping
The X architecture has 16 general and the F status register. In x86-64
there are also 16 general purpose registers. The register mapping on
the right must be used when translating from X to x86-64. Note that
for this exercise register r13 will not be used by the X executables. Instead of r13 (X) being mapped to r15 (x86), the F register (X) is mapped
to register r15 (x86). Note: for this assignment, It is ok to map 16-bit
registers to 64-bit registers.
Debug mode STD and CLD
The std and cld X instructions enable and disable debug mode on
the X architecture. However, debug mode does not exist in x86-64.
Instead, when a std instruction is encountered, the translator should
set an internal debug flag in the translator and, clear the debug flag
when it encounters the cld instruction.
When the debug flag is true, the translator should output the assembly
code on the right before translating each X instruction.
Output and the OUT Instruction (For Task 2)
On the X architecture, the out rN instruction outputs to the screen the character stored in register rN.
However, no such instruction exists in x86-64. Instead, the out instruction is translated to a call to the
function outchar(char c), which performs this function. Recall that the first argument is passed in
register %rdi. Consequently, the corresponding translation code will need to save the current value of
%rdi on the stack, move the byte to be printed into %rdi, call outchar, and restore %rdi.
Your task will be to implement the Xtra binary translator which is used to translate into x86 assembly
programs assembled with the X assembler.
.globl test
test:
 push %rbp
 mov %rsp, %rbp
 pop %rbp
 ret
X Instruction Output x86 Assembly
mov r0, r1 mov %rax, %rdi
loadi 42, r0 mov $42, %rax
push r0 push %rax
add r0, r1 add %rax, %rdi
X Registers x86 Registers
r0 %rax
r1 %rbx
r2 %rcx
r3 %rdx
r4 %rsi
r5 %rdi
r6 %r8
r7 %r9
r8 %r10
r9 %r11
r10 %r12
r11 %r13
r12 %r14
F %r15
r14 %rbp
r15 %rsp
 call debug
Task 1: Implement the Simple Xtra
Your first task is to implement a simple version of the translator that works for the simple instructions.
The source file main.c should contain the main() function. The translator should:
1. Take one (1) argument on the command line: The argument is the object/executable file of the
program to translate. For example, the invocation
./xtra hello.xo
instructs the translator to translate the program hello.xo into x86-64 assembly.
2. Open for reading the file specified on the command-line.
3. Output (to stdout) the prologue.
4. In a loop,
a. Read in instruction.
b. If the instruction is 0x00 0x00, break out of the loop.
c. Translate the instruction and output (to stdout) the x86-64 assembly.
5. Output (to stdout) the epilogue.
Input
The input to the program is via the command line. The program takes one argument, the name of the file
containing the assembled X code.
Processing
All input shall be correct. All program files shall be at most 65536 bytes (64KB). The translator must be
able to translate all instructions except:
Instruction Description
ret Return from a procedure call.
br L Branch relative to label L if condition bit is true.
jr L Jump relative to label L.
jmp L Absolute jump to label L.
call L Absolute call to label L.
load rS , rD Load word into register rD from memory pointed to by register rS.
stor rS , rD Store word from register rS to memory at address in register rD.
loadb rS , rD Load byte into register rD from memory pointed to by register rS.
storb rS , rD Store byte from register rS to memory at address in register rD.
out rS Output character in rS to stdout.
Recommendation: While no error checking is required, it may be helpful to still do error checking, e.g.,
make sure files are properly opened because it will help with debugging as well.
Output
Output should be to stdout. The output is the translated assembly code. The format should ATT style
assembly. The exact formatting of the assembly is up to you, but the assembly code will be passed through
the standard assembler (as) on timberlea. See next section for how to test your code. (See example)
Testing
To test your translator, the test scripts will assembler, link, and run the translated code! J A runit.sh
script is provided. The script takes an X assembly file as an argument:
./runit.sh foo.xas
The script:
1. Assembles the .xas file with the provided (xas) to create a .xo file.
2. Runs xtra on the .xo file, to create a corresponding x86 .s assembly file.
3. Assembles, compiles, and links the generated assembly file with some runner code, creating an
executable. The runner is composed of runner.c, regsdump.s, and the translated .s file.
Please DO NOT delete the first two files.
4. Runs the executable.
This script is used by the test scripts and is also useful for you to test your code.
Most of the tests use the std instruction to turn on debugging and output the state of the registers after
each instruction is executed. For most of the tests the output being compared are the register values.
Example
Original X assembly code Translated x86 code
 loadi 2, r0
 loadi 3, r1
 loadi 4, r2
 loadi 5, r3
 loadi 7, r5
 std # turn debugging on
 add r2, r3
 mul r2, r1
 cld # turn debugging off
 neg r0
 inc r5
.literal 0
.globl test
test:
 push %rbp
 mov %rsp, %rbp
 mov $2, %rax
 mov $3, %rbx
 mov $4, %rcx
 mov $5, %rdx
 mov $7, %rdi
 call debug
 add %rcx, %rdx
 call debug
 imul %rcx, %rbx
 call debug
 neg %rax
 inc %rdi
 pop %rbp
 ret
Task 2: The Full Translator
Your second task is to extend xtra to translate the instructions exempted in Task 1. Implement translation for the following instructions.
Instruction Description
ret Return from a procedure call.
br L Branch relative to label L if condition bit is true.
jr L Jump relative to label L.
jmp L Absolute jump to label L.
call L Absolute call to label L.
load rS , rD Load word into register rD from memory pointed to by register rS.
stor rS , rD Store word from register rS to memory at address in register rD.
loadb rS , rD Load byte into register rD from memory pointed to by register rS.
storb rS , rD Store byte from register rS to memory at address in register rD.
out rS Output character in rS to stdout.
Input
The input is the same as Task 1.
Processing
The processing is the same as for Task 1. The challenge is that translation is a bit more challenging.
First, for many of the additional instructions you will need to emit more than one assembly instruction.
This is particularly true for the conditional branching and output instructions.
Second, for the branching instructions you will need to compute the labels where to branch to. The easy
solution is to create a label for each instruction being translated. The label should encode the address in
the name. For example, L1234 would be the label for the X instruction at address 1234. By doing this,
you will not need to keep a list or database of labels.
Third, the addresses used by the load and store are full 64-bit values.
Output
The output is the same as Task 1.
Example
Original X assembly code Translated x86 code
 loadi 1, r0
 jmp j1
j2:
 loadi 3, r0
 jmp j3
j1:
 loadi 2, r0
 jmp j2
j3:
 std # turn debugging on
 loadi 4, r0
.literal 0
.globl test
test:
 push %rbp
 mov %rsp, %rbp
.L0000:
 mov $1, %rax
.L0004:
 jmp .L0010
.L0008:
 mov $3, %rax
.L000c:
 jmp .L0018
.L0010:
 mov $2, %rax
.L0014:
 jmp .L0008
.L0018:
.L001a:
 call debug
 mov $4, %rax
.L001e:
 call debug
 pop %rbp
 ret
Hints and Suggestions • Use the unsigned short type for all registers and indices.
• Use two files: one the main program and one for the translator loop.
• Start early, this is the hardest assignment of the term and there is a lot to digest in the assignment
specifications.
Assignment Submission
Submission and testing are done using Git, Gitlab, and Gitlab CI/CD. You can submit as many times as you
wish, up to the deadline. Every time a submission occurs, functional tests are executed, and you can view
the results of the tests. To submit use the same procedure as Assignment 0.
Grading
If your program does not compile, it is considered non-functional and of extremely poor quality, meaning you will receive 0 for the solution.
The assignment will be graded based on three criteria:
Functionality: “Does it work according to specifications?”. This is determined in an automated fashion by
running your program on several inputs and ensuring that the outputs match the expected outputs. The
score is determined based on the number of tests that your program passes. So, if your program passes
t/T tests, you will receive that proportion of the marks.
Quality of Solution: “Is it a good solution?” This considers whether the approach and algorithm in your
solution is correct. This is determined by visual inspection of the code. It is possible to get a good grade
on this part even if you have bugs that cause your code to fail some of the tests.
Code Clarity: “Is it well written?” This considers whether the solution is properly formatted, well documented, and follows coding style guidelines. A single overall mark will be assigned for clarity. Please see
the Style Guide in the Assignment section of the course in Brightspace.
The following grading scheme will be used:
Task 100% 80% 60% 40% 20% 0%
Functionality
(20 marks) Equal to the number of tests passed.
Solution Quality
Task 1
(15 marks)
Implemented
correctly. Code
is robust.
Implemented correctly. Code is not
robust.
Some minor bugs. Major flaws in
implementation
An attempt
has been
made.
code
No code submitted or
does not compile
Solution Quality
Task 2
(5 marks)
Implemented
correctly. Code
is robust.
Implemented correctly. Code is not
robust.
Some minor bugs. Major flaws in
implementation
An attempt
has been
made
Code Clarity
(10 marks)
Indentation, formatting, naming,
comments
Code looks professional and follows all style
guidelines
Code looks good
and mostly follows style guidelines.
Code is mostly
readable and
mostly follows
some of the style
guidelines
Code is hard to
read and follows few of the
style guidelines
Code is not
legible
Assignment Testing without Submission
Testing via submission can take some time, especially if the server is loaded. You can run the tests without
submitting your code by using the provided runtests.sh script. Running the script with no arguments
will run all the tests. Running the script with the test number, i.e., 00, 01, 02, 03, … 09, will run that specific
test. Please see below for how run the script.
Get your program ready to run
If you are developing directly on the unix server,
1. SSH into the remote server and be sure you are in the xtra directory.
2. Be sure the program is compiled by running make.
If you are using CLion
1. Run your program on the remote server as described in the CLion tutorials.
2. Open a remote host terminal via Tools → Open Remote Host Terminal
If you are using VSCode
1. Run your program on the remote server as described in VSCode tutorials.
2. Click on the Terminal pane in the bottom half of the window or via Terminal → New Terminal
Run the script
3. Run the script in the terminal by using the command:
./runtest.sh
to run all the tests, or specify the test number to run a specific test, e.g. :
./runtest.sh 07
You will see the test run in the terminal window.
The X Assembler (xas)
An assembler (xas) is provided to allow you to write and compile programs for the X Architecture. To
make the assembler, simply run “make xas” in the xtra directory. To run the assembler, specify the
assembly and executable file on the command-line. For example,
./xas example.xas example.xo
Assembles the X assembly file example.xas into an X executable example.xo.
The format of the assembly files is simple.
1. Anything to the right of a #    mark, including the #, is considered a comment and ignored.
2. Blank lines are ignored.
3. Each line in the assembly file that is not blank must contains a directive, a label and/or an instruction. If the line contains both a label and an instruction, the label must come first.
4. A label is of the form
identifier:
where identifier    consists of any sequence of letters (A-Za-z), digits (0-9), or underscores ( ) as long
the first character is not a digit. A colon (:) must terminate the label. A label represents the corresponding location in the program and may be used to jump to that location in the code.
5. An instruction consists of a mnemonic, such as add, loadi, push, etc., followed by zero or more
operands. The operand must be separated from the mnemonic by one or more white spaces.
Multiple operands are separated by a comma.
6. If an operand is a register, then it must be in the form r#    where # ranges between 0 and 15 inclusively. E.g., r13.
7. If the instruction is an immediate, then the argument may either be a label, or an integer. Note:
labels are case-sensitive. If a label is specified, no colon should follow the label.
8. Directives instruct the assembler to perform a specific function or behave in a specific manner.
All directives begin with a period and are followed by a keyword. There are three directives: .literal, .words    and .glob, each of which takes an operand.
(a) The .literal directive encodes a null terminated string or an integer at the present
location in the program. E.g.,
mystring:
.literal "Hello World!"
myvalue:
.literal 42
encodes a nil-terminated string followed by a 16-bit (1 word) value representing the decimal value 42. In this example, there are labels preceding each of the encodings so that it
is easy to access these literals. That is, the label mystring represents the address (relative to the start of the program) where the string is encoded, and the label myvalue
represents the address (relative to the start of the program) of the value. This is used in
the hello.xas example.
(b) The .words directive sets aside a specified number of words of memory at    the    present    
location    in    the    program. E.g.,
myspace:
.words 6
allocates 6 words of memory at the present point in the program. This space is not initialized to any specific value. Just as before, the label preceding the directive represents the
address of the first word, relative to the start of the program. This is used in xrt0.xas    to
set aside space for the program stack.
(c) The .glob directive exports the specified symbol (label) if it is defined in the file and
imports the specified symbol (label) if it is used but not defined in the file. E.g.,
.glob foo
.glob bar
...
loadi bar, r0
...
foo:
 .literal "Hello World!"
declares two symbols (labels) foo    and    bar.    Symbol    foo    is    declared    in    this    file,    so    it    will    
be    exported    (can    be    accessed)    in    other    files.    The    latter    symbol,    bar,    is    used    but    not    
defined.    When    this    file    is    linked,    the    linker    looks    for    the    symbol    (label)    definition    in    
other    files    makes    all    references    to    the    symbol    refer    to    where    it    is    defined.    
Note: it is recommended that you place literals and all space allocations at the end of your program, so
that they will not interfere with program itself. If you do place literals in the middle of your program, you
will need to ensure that your code jumps around these allocations.
There are several example assembly files provided (ending in .xas). You can assemble them by invoking
the assembler, for example:
./xas example.xas example.xo
This invocation will cause the assembler to read in the file example.xas and generate an output
file example.xo. Feel free to look at the code for the assembler. 
請(qǐng)加QQ:99515681  郵箱:99515681@qq.com   WX:codehelp 



 

掃一掃在手機(jī)打開(kāi)當(dāng)前頁(yè)
  • 上一篇:COMP2045代做、C++編程設(shè)計(jì)代寫
  • 下一篇:代寫CPSC 217、代做python編程設(shè)計(jì)
  • 無(wú)相關(guān)信息
    合肥生活資訊

    合肥圖文信息
    急尋熱仿真分析?代做熱仿真服務(wù)+熱設(shè)計(jì)優(yōu)化
    急尋熱仿真分析?代做熱仿真服務(wù)+熱設(shè)計(jì)優(yōu)化
    出評(píng) 開(kāi)團(tuán)工具
    出評(píng) 開(kāi)團(tuán)工具
    挖掘機(jī)濾芯提升發(fā)動(dòng)機(jī)性能
    挖掘機(jī)濾芯提升發(fā)動(dòng)機(jī)性能
    海信羅馬假日洗衣機(jī)亮相AWE  復(fù)古美學(xué)與現(xiàn)代科技完美結(jié)合
    海信羅馬假日洗衣機(jī)亮相AWE 復(fù)古美學(xué)與現(xiàn)代
    合肥機(jī)場(chǎng)巴士4號(hào)線
    合肥機(jī)場(chǎng)巴士4號(hào)線
    合肥機(jī)場(chǎng)巴士3號(hào)線
    合肥機(jī)場(chǎng)巴士3號(hào)線
    合肥機(jī)場(chǎng)巴士2號(hào)線
    合肥機(jī)場(chǎng)巴士2號(hào)線
    合肥機(jī)場(chǎng)巴士1號(hào)線
    合肥機(jī)場(chǎng)巴士1號(hào)線
  • 短信驗(yàn)證碼 豆包 幣安下載 AI生圖 目錄網(wǎng)

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

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

    99爱在线视频这里只有精品_窝窝午夜看片成人精品_日韩精品久久久毛片一区二区_亚洲一区二区久久

          免费黄网站欧美| 国产偷国产偷精品高清尤物| 国内精品视频666| 亚洲黄色免费| 久久国产欧美日韩精品| 欧美亚男人的天堂| 亚洲精品视频一区二区三区| 久久免费黄色| 黄色亚洲精品| 久久久久久久久久看片| 国产精品美女久久久久av超清| 日韩亚洲精品视频| 欧美成人免费在线| 亚洲国产精品一区二区三区| 久久久久在线观看| 激情久久久久| 久久久久久噜噜噜久久久精品| 国产欧美在线视频| 久久av一区二区三区漫画| 国产日韩欧美成人| 久久av一区| 激情综合中文娱乐网| 久久久久久亚洲精品杨幂换脸| 国产精品久久久爽爽爽麻豆色哟哟| 日韩一区二区电影网| 欧美日韩在线看| 一区二区三区 在线观看视频| 欧美精品三级日韩久久| 99riav1国产精品视频| 欧美日本国产精品| 亚洲一区免费观看| 国产一区导航| 欧美91视频| 夜夜嗨av一区二区三区中文字幕| 欧美人成免费网站| 亚洲午夜一区二区三区| 国产精品一区久久| 久久精品国产96久久久香蕉| 一区二区三区自拍| 欧美日韩高清一区| 亚洲综合欧美日韩| 极品av少妇一区二区| 欧美激情一区| 亚洲自拍偷拍麻豆| 狠狠色伊人亚洲综合网站色| 欧美高清在线视频观看不卡| 亚洲裸体视频| 国产欧美三级| 你懂的视频欧美| 亚洲午夜女主播在线直播| 国产欧美一区二区三区在线老狼 | 欧美日本在线观看| 亚洲先锋成人| 99视频精品| 亚洲淫性视频| 一区二区三区欧美亚洲| 日韩一级黄色大片| 欧美一区影院| 欧美在线视频导航| 欧美激情第一页xxx| 欧美国产日本韩| 欧美国产高清| 久久久www免费人成黑人精品| 这里只有精品丝袜| 在线视频精品一| 欧美一区二区视频在线观看| 麻豆精品视频在线| 蜜月aⅴ免费一区二区三区| 一本久道综合久久精品| 99riav1国产精品视频| 国产精品久久国产愉拍| 欧美激情91| 欧美日韩国产黄| 国产日韩高清一区二区三区在线| **网站欧美大片在线观看| 亚洲美女在线国产| 久久国产欧美| 国产区亚洲区欧美区| 亚洲精品国产精品国自产观看| 夜夜夜久久久| 欧美美女福利视频| 亚洲高清在线视频| 亚洲亚洲精品在线观看| 欧美日韩国产综合久久| 亚洲一区制服诱惑| 国模叶桐国产精品一区| 午夜视频在线观看一区二区| 欧美久久久久久久久| 亚洲国产精品精华液2区45 | 欧美日韩一区二区视频在线观看| 国产性猛交xxxx免费看久久| 每日更新成人在线视频| 国产日韩精品一区二区浪潮av| 日韩小视频在线观看| 国产精品99免费看 | 一本一本久久a久久精品综合麻豆| 香蕉久久夜色精品| 国产毛片精品视频| 欧美日韩精品免费观看| 午夜精品久久| 国产精品拍天天在线| 欧美不卡视频一区| 伊人久久亚洲美女图片| 欧美韩国日本综合| 国产一区二区三区四区hd| 麻豆国产精品va在线观看不卡| 亚洲国产精品电影| 亚洲国产精品一区二区久| 国产午夜精品视频| 久久久久综合| 久久久www成人免费毛片麻豆| 国产精品久久久久aaaa九色| 欧美日韩在线三级| 久久99在线观看| 亚洲精品国产日韩| 国产麻豆精品theporn| 美日韩精品视频免费看| 久久精品欧美日韩| 久久久国产成人精品| 国产婷婷色一区二区三区| 久久综合电影| 欧美极品在线视频| 国产精品拍天天在线| 国产色视频一区| 国产亚洲欧美aaaa| 欧美理论电影在线观看| 久久久久国产精品一区三寸| 久久亚洲春色中文字幕久久久| 亚洲人成在线观看网站高清| 国产伦精品一区二区三区视频黑人| 国产精品乱看| 久久综合狠狠综合久久综青草| 蜜乳av另类精品一区二区| 欧美精品一区二区三区视频| 午夜亚洲影视| 免费试看一区| 国内精品久久久久影院色 | 国产免费亚洲高清| 嫩草成人www欧美| 麻豆国产va免费精品高清在线| 欧美日韩精品免费观看视一区二区| 欧美国产精品久久| 老鸭窝91久久精品色噜噜导演| 另类综合日韩欧美亚洲| 美女视频一区免费观看| 欧美精品1区| 国产色爱av资源综合区| 亚洲美女视频在线免费观看| 亚洲激情啪啪| 亚洲精品一区二区三区蜜桃久| 久久久久久久999精品视频| 久久在线视频在线| 欧美区一区二| 欧美日韩成人在线| 亚洲电影毛片| 欧美日韩理论| 亚洲精品字幕| 久久久999精品免费| 欧美三区美女| 亚洲自拍电影| 欧美日韩亚洲系列| 在线日韩欧美| 欧美天堂亚洲电影院在线播放| 国产一区深夜福利| 91久久中文字幕| 亚洲性感美女99在线| 久久精品在线免费观看| 欧美日韩卡一卡二| 尤物在线精品| 亚洲视频1区2区| 国产精品婷婷| 欧美精品1区2区3区| 国产视频亚洲| 老司机凹凸av亚洲导航| 国产精品区一区二区三区| 一区二区三区视频在线看| 欧美高清在线一区| 亚洲国产婷婷香蕉久久久久久99| 久久av一区二区三区亚洲| 国产精品美女午夜av| 一区二区三区视频在线| 欧美日韩视频不卡| 99精品欧美一区二区蜜桃免费| 欧美精品久久天天躁| 在线观看av不卡| 乱中年女人伦av一区二区| 精品69视频一区二区三区| 久久精品在线观看| 国内成人精品视频| 久久女同精品一区二区| 精品成人免费| 欧美成人一区二区三区片免费| 亚洲啪啪91| 欧美日韩中文字幕在线视频| 一本色道久久综合亚洲精品婷婷 | 老色批av在线精品| 久久精品国产999大香线蕉| 亚洲精品美女| 国产精品亚洲欧美| 久久综合九色综合久99|