赞
踩
前期准备参考: 深入理解计算机系统 CSAPP 第四章 Y86-64模拟器 安装与使用-CSDN博客
writeup上写了要求,这里就不赘述了.
- # Execution begins at address 0
- .pos 0
- irmovq stack, %rsp # Set up stack pointer
- call main # Execute main program
- halt # Terminate program
-
- # Sample linked list
- .align 8
- ele1:
- .quad 0x00a
- .quad ele2
- ele2:
- .quad 0x0b0
- .quad ele3
- ele3:
- .quad 0xc00
- .quad 0
-
-
- main: irmovq ele1,%rdi
- call sum # sum(ele1)
- ret
-
- # long sum(long *start)
- # start in %rdi
- sum: xorq %rax,%rax # sum = 0
- andq %rdi,%rdi # Set CC
- jmp test # Goto test
- loop: mrmovq (%rdi),%r10 # Get *start
- irmovq $8,%r8
- addq %r10,%rax # Add to sum
- addq %r8,%rdi # start++
- mrmovq (%rdi),%rdi # *start
- andq %rdi,%rdi # Set CC
- test: jne loop # Stop when 0
- ret # Return
-
- # Stack starts here and grows to lower addresses
- .pos 0x200
- stack:
addq %r8,%rdi 是下一个元素的地址,不是值.
- # Execution begins at address 0
- .pos 0
- irmovq stack, %rsp # Set up stack pointer
- call main # Execute main program
- halt # Terminate program
-
- # Sample linked list
- .align 8
- ele1:
- .quad 0x00a
- .quad ele2
- ele2:
- .quad 0x0b0
- .quad ele3
- ele3:
- .quad 0xc00
- .quad 0
-
-
- main: irmovq ele1,%rdi
- xorq %rax,%rax # sum = 0
- call rsum # rsum(rsum)
- ret
-
- # long rsum(long *start)
- # start in %rdi
- rsum: andq %rdi,%rdi # Set CC
- je return # Stop when 0
- mrmovq (%rdi),%rbx # Get *start
- mrmovq 8(%rdi),%rdi # *start
- pushq %rbx
- call rsum
- popq %rbx
- addq %rbx,%rax # Add to sum
- return: ret # Return
-
- # Stack starts here and grows to lower addresses
- .pos 0x200
- stack:
- # Execution begins at address 0
- .pos 0
- irmovq stack, %rsp # Set up stack pointer
- call main # Execute main program
- halt # Terminate program
-
- .align 8
- # Source block
- src:
- .quad 0x00a
- .quad 0x0b0
- .quad 0xc00
- # Destination block
- dest:
- .quad 0x111
- .quad 0x222
- .quad 0x333
-
-
- main: irmovq src,%rdi
- irmovq dest,%rsi
- irmovq $3,%rdx
- call copy # copy(src,dest,0)
- ret
-
- # long copy(long *src,long *dest,long len)
- # src in %rdi ,dest in %rsi,len in %rdx
- copy: xorq %rax,%rax # result = 0
- loop: andq %rdx,%rdx
- mrmovq (%rdi),%rcx
- rmmovq %rcx,(%rsi)
- irmovq $1,%r10
- irmovq $8,%r8
- xorq %rcx,%rax
- addq %r8,%rdi
- addq %r8,%rsi
- subq %r10,%rdx
- jg loop # >0
- return: ret # Return
-
- # Stack starts here and grows to lower addresses
- .pos 0x200
- stack:
因为前面的家庭作业和练习题已经做过这个,这里不在赘述了.
参考,图4-18,在不同的阶段需要用哪写寄存器,修改哪些逻辑,添加上 ,IIADDQ 即可.
- #/* $begin seq-all-hcl */
- ####################################################################
- # HCL Description of Control for Single Cycle Y86-64 Processor SEQ #
- # Copyright (C) Randal E. Bryant, David R. O'Hallaron, 2010 #
- ####################################################################
-
- ## Your task is to implement the iaddq instruction
- ## The file contains a declaration of the icodes
- ## for iaddq (IIADDQ)
- ## Your job is to add the rest of the logic to make it work
-
- ####################################################################
- # C Include's. Don't alter these #
- ####################################################################
-
- quote '#include <stdio.h>'
- quote '#include "isa.h"'
- quote '#include "sim.h"'
- quote 'int sim_main(int argc, char *argv[]);'
- quote 'word_t gen_pc(){return 0;}'
- quote 'int main(int argc, char *argv[])'
- quote ' {plusmode=0;return sim_main(argc,argv);}'
-
- ####################################################################
- # Declarations. Do not change/remove/delete any of these #
- ####################################################################
-
- ##### Symbolic representation of Y86-64 Instruction Codes #############
- wordsig INOP 'I_NOP'
- wordsig IHALT 'I_HALT'
- wordsig IRRMOVQ 'I_RRMOVQ'
- wordsig IIRMOVQ 'I_IRMOVQ'
- wordsig IRMMOVQ 'I_RMMOVQ'
- wordsig IMRMOVQ 'I_MRMOVQ'
- wordsig IOPQ 'I_ALU'
- wordsig IJXX 'I_JMP'
- wordsig ICALL 'I_CALL'
- wordsig IRET 'I_RET'
- wordsig IPUSHQ 'I_PUSHQ'
- wordsig IPOPQ 'I_POPQ'
- # Instruction code for iaddq instruction
- wordsig IIADDQ 'I_IADDQ'
- ##### Symbolic represenations of Y86-64 function codes #####
- wordsig FNONE 'F_NONE' # Default function code
-
- ##### Symbolic representation of Y86-64 Registers referenced explicitly #####
- wordsig RRSP 'REG_RSP' # Stack Pointer
- wordsig RNONE 'REG_NONE' # Special value indicating "no register"
-
- ##### ALU Functions referenced explicitly #####
- wordsig ALUADD 'A_ADD' # ALU should add its arguments
-
- ##### Possible instruction status values #####
- wordsig SAOK 'STAT_AOK' # Normal execution
- wordsig SADR 'STAT_ADR' # Invalid memory address
- wordsig SINS 'STAT_INS' # Invalid instruction
- wordsig SHLT 'STAT_HLT' # Halt instruction encountered
-
- ##### Signals that can be referenced by control logic ####################
- ##### Fetch stage inputs #####
- wordsig pc 'pc' # Program counter
- ##### Fetch stage computations #####
- wordsig imem_icode 'imem_icode' # icode field from instruction memory
- wordsig imem_ifun 'imem_ifun' # ifun field from instruction memory
- wordsig icode 'icode' # Instruction control code
- wordsig ifun 'ifun' # Instruction function
- wordsig rA 'ra' # rA field from instruction
- wordsig rB 'rb' # rB field from instruction
- wordsig valC 'valc' # Constant from instruction
- wordsig valP 'valp' # Address of following instruction
- boolsig imem_error 'imem_error' # Error signal from instruction memory
- boolsig instr_valid 'instr_valid' # Is fetched instruction valid?
-
- ##### Decode stage computations #####
- wordsig valA 'vala' # Value from register A port
- wordsig valB 'valb' # Value from register B port
-
- ##### Execute stage computations #####
- wordsig valE 'vale' # Value computed by ALU
- boolsig Cnd 'cond' # Branch test
-
- ##### Memory stage computations #####
- wordsig valM 'valm' # Value read from memory
- boolsig dmem_error 'dmem_error' # Error signal from data memory
-
-
- ####################################################################
- # Control Signal Definitions. #
- ####################################################################
-
- ################ Fetch Stage ###################################
-
- # Determine instruction code
- word icode = [
- imem_error: INOP;
- 1: imem_icode; # Default: get from instruction memory
- ];
-
- # Determine instruction function
- word ifun = [
- imem_error: FNONE;
- 1: imem_ifun; # Default: get from instruction memory
- ];
-
- bool instr_valid = icode in
- { INOP, IHALT, IRRMOVQ, IIRMOVQ, IRMMOVQ, IMRMOVQ,
- IOPQ, IJXX, ICALL, IRET, IPUSHQ, IPOPQ, IIADDQ };#changed
-
- # Does fetched instruction require a regid byte?
- bool need_regids =
- icode in { IRRMOVQ, IOPQ, IPUSHQ, IPOPQ,
- IIRMOVQ, IRMMOVQ, IMRMOVQ , IIADDQ};#changed
-
- # Does fetched instruction require a constant word?
- bool need_valC =
- icode in { IIRMOVQ, IRMMOVQ, IMRMOVQ, IJXX, ICALL, IIADDQ };#changed
-
- ################ Decode Stage ###################################
-
- ## What register should be used as the A source?
- word srcA = [
- icode in { IRRMOVQ, IRMMOVQ, IOPQ, IPUSHQ } : rA;
- icode in { IPOPQ, IRET } : RRSP;
- 1 : RNONE; # Don't need register
- ];
-
- ## What register should be used as the B source?
- word srcB = [
- icode in { IOPQ, IRMMOVQ, IMRMOVQ , IIADDQ } : rB;#changed
- icode in { IPUSHQ, IPOPQ, ICALL, IRET } : RRSP;
- 1 : RNONE; # Don't need register
- ];
-
- ## What register should be used as the E destination?
- word dstE = [
- icode in { IRRMOVQ } && Cnd : rB;
- icode in { IIRMOVQ, IOPQ, IIADDQ} : rB;#changed
- icode in { IPUSHQ, IPOPQ, ICALL, IRET } : RRSP;
- 1 : RNONE; # Don't write any register
- ];
-
- ## What register should be used as the M destination?
- word dstM = [
- icode in { IMRMOVQ, IPOPQ } : rA;
- 1 : RNONE; # Don't write any register
- ];
-
- ################ Execute Stage ###################################
-
- ## Select input A to ALU
- word aluA = [
- icode in { IRRMOVQ, IOPQ } : valA;
- icode in { IIRMOVQ, IRMMOVQ, IMRMOVQ, IIADDQ } : valC;#changed
- icode in { ICALL, IPUSHQ } : -8;
- icode in { IRET, IPOPQ } : 8;
- # Other instructions don't need ALU
- ];
-
- ## Select input B to ALU
- word aluB = [
- icode in { IRMMOVQ, IMRMOVQ, IOPQ, ICALL,
- IPUSHQ, IRET, IPOPQ, IIADDQ } : valB;#changed
- icode in { IRRMOVQ, IIRMOVQ } : 0;
- # Other instructions don't need ALU
- ];
-
- ## Set the ALU function
- word alufun = [
- icode == IOPQ : ifun;
- 1 : ALUADD;
- ];
-
- ## Should the condition codes be updated?
- bool set_cc = icode in { IOPQ, IIADDQ };#changed
-
- ################ Memory Stage ###################################
-
- ## Set read control signal
- bool mem_read = icode in { IMRMOVQ, IPOPQ, IRET };
-
- ## Set write control signal
- bool mem_write = icode in { IRMMOVQ, IPUSHQ, ICALL };
-
- ## Select memory address
- word mem_addr = [
- icode in { IRMMOVQ, IPUSHQ, ICALL, IMRMOVQ } : valE;
- icode in { IPOPQ, IRET } : valA;
- # Other instructions don't need address
- ];
-
- ## Select memory input data
- word mem_data = [
- # Value from register
- icode in { IRMMOVQ, IPUSHQ } : valA;
- # Return PC
- icode == ICALL : valP;
- # Default: Don't write anything
- ];
-
- ## Determine instruction status
- word Stat = [
- imem_error || dmem_error : SADR;
- !instr_valid: SINS;
- icode == IHALT : SHLT;
- 1 : SAOK;
- ];
-
- ################ Program Counter Update ############################
-
- ## What address should instruction be fetched at
-
- word new_pc = [
- # Call. Use instruction constant
- icode == ICALL : valC;
- # Taken branch. Use instruction constant
- icode == IJXX && Cnd : valC;
- # Completion of RET instruction. Use value from stack
- icode == IRET : valM;
- # Default: Use incremented PC
- 1 : valP;
- ];
- #/* $end seq-all-hcl */
sim文件夹中右键启动终端,重新生成版本为full的ssim版本:
make clean;make VERSION=full
sim/seq文件夹中右键启动终端,运行单个程序测试:
./ssim -t ../y86-code/asumi.yo
单步调试命令:
./ssim -g ../y86-code/asumi.yo
sim/ptest文件夹中右键启动终端,运行所有测试:全部通过.
make SIM=../seq/ssim TFLAGS=-i
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。