part A
[root@edb3963640a6 misc]#./yas sum.ys
[root@edb3963640a6 misc]# ./yis sum.yo
./yas 和 ./yis 是匯編語言編譯器和模擬器的命令行工具。
./yas 是一個匯編語言編譯器,它將匯編語言代碼轉換為可執行的二進制文件。./yas sum.ys 將sum.ys文件編譯成了sum.yo可執行文件。
./yis 是一個模擬器,它用于執行和模擬已編譯的二進制文件。運行./yis sum.yo 將執行sum.yo文件并輸出結果。
這兩個工具通常用于匯編語言的開發和調試過程中。
part B
使用的Y86-64指令需要先使用irmovq指令將一個寄存器設置為常量,然后使用addq指令將這個值添加到目標寄存器。假設我們想要添加一個新的指令iaddq
參考知乎網友寫的 iaddq指令的處理階段, 使用hcl語言寫出這個流程。
seq-full.hcl 文件:
執行 make VERSION=full
在asumi.yo 文件中調用iaddq指令
執行 ./ssim -t …/y86-code/asumi.yo
[root@edb3963640a6 seq]# ./ssim -t ../y86-code/asumi.yo
Y86-64 Processor: seq-full.hcl
137 bytes of code read
IF: Fetched irmovq at 0x0. ra=----, rb=%rsp, valC = 0x100
IF: Fetched call at 0xa. ra=----, rb=----, valC = 0x38
Wrote 0x13 to address 0xf8
IF: Fetched irmovq at 0x38. ra=----, rb=%rdi, valC = 0x18
IF: Fetched irmovq at 0x42. ra=----, rb=%rsi, valC = 0x4
IF: Fetched call at 0x4c. ra=----, rb=----, valC = 0x56
Wrote 0x55 to address 0xf0
IF: Fetched xorq at 0x56. ra=%rax, rb=%rax, valC = 0x0
IF: Fetched andq at 0x58. ra=%rsi, rb=%rsi, valC = 0x0
IF: Fetched jmp at 0x5a. ra=----, rb=----, valC = 0x83
IF: Fetched jne at 0x83. ra=----, rb=----, valC = 0x63
IF: Fetched mrmovq at 0x63. ra=%r10, rb=%rdi, valC = 0x0
IF: Fetched addq at 0x6d. ra=%r10, rb=%rax, valC = 0x0
IF: Fetched iaddq at 0x6f. ra=----, rb=%rdi, valC = 0x8
IF: Fetched iaddq at 0x79. ra=----, rb=%rsi, valC = 0xffffffffffffffff
IF: Fetched jne at 0x83. ra=----, rb=----, valC = 0x63
IF: Fetched mrmovq at 0x63. ra=%r10, rb=%rdi, valC = 0x0
IF: Fetched addq at 0x6d. ra=%r10, rb=%rax, valC = 0x0
IF: Fetched iaddq at 0x6f. ra=----, rb=%rdi, valC = 0x8
IF: Fetched iaddq at 0x79. ra=----, rb=%rsi, valC = 0xffffffffffffffff
IF: Fetched jne at 0x83. ra=----, rb=----, valC = 0x63
IF: Fetched mrmovq at 0x63. ra=%r10, rb=%rdi, valC = 0x0
IF: Fetched addq at 0x6d. ra=%r10, rb=%rax, valC = 0x0
IF: Fetched iaddq at 0x6f. ra=----, rb=%rdi, valC = 0x8
IF: Fetched iaddq at 0x79. ra=----, rb=%rsi, valC = 0xffffffffffffffff
IF: Fetched jne at 0x83. ra=----, rb=----, valC = 0x63
IF: Fetched mrmovq at 0x63. ra=%r10, rb=%rdi, valC = 0x0
IF: Fetched addq at 0x6d. ra=%r10, rb=%rax, valC = 0x0
IF: Fetched iaddq at 0x6f. ra=----, rb=%rdi, valC = 0x8
IF: Fetched iaddq at 0x79. ra=----, rb=%rsi, valC = 0xffffffffffffffff
IF: Fetched jne at 0x83. ra=----, rb=----, valC = 0x63
IF: Fetched ret at 0x8c. ra=----, rb=----, valC = 0x0
IF: Fetched ret at 0x55. ra=----, rb=----, valC = 0x0
IF: Fetched halt at 0x13. ra=----, rb=----, valC = 0x0
32 instructions executed
Status = HLT
Condition Codes: Z=1 S=0 O=0
Changed Register State:
%rax: 0x0000000000000000 0x0000abcdabcdabcd
%rsp: 0x0000000000000000 0x0000000000000100
%rdi: 0x0000000000000000 0x0000000000000038
%r10: 0x0000000000000000 0x0000a000a000a000
Changed Memory State:
0x00f0: 0x0000000000000000 0x0000000000000055
0x00f8: 0x0000000000000000 0x0000000000000013
ISA Check Succeeds
[root@edb3963640a6 seq]#
執行 testssim
[root@edb3963640a6 y86-code]# make testssim
../seq/ssim -t asum.yo > asum.seq
../seq/ssim -t asumr.yo > asumr.seq
../seq/ssim -t cjr.yo > cjr.seq
../seq/ssim -t j-cc.yo > j-cc.seq
../seq/ssim -t poptest.yo > poptest.seq
../seq/ssim -t pushquestion.yo > pushquestion.seq
../seq/ssim -t pushtest.yo > pushtest.seq
../seq/ssim -t prog1.yo > prog1.seq
../seq/ssim -t prog2.yo > prog2.seq
../seq/ssim -t prog3.yo > prog3.seq
../seq/ssim -t prog4.yo > prog4.seq
../seq/ssim -t prog5.yo > prog5.seq
../seq/ssim -t prog6.yo > prog6.seq
../seq/ssim -t prog7.yo > prog7.seq
../seq/ssim -t prog8.yo > prog8.seq
../seq/ssim -t ret-hazard.yo > ret-hazard.seq
grep "ISA Check" *.seq
asum.seq:ISA Check Succeeds
asumr.seq:ISA Check Succeeds
cjr.seq:ISA Check Succeeds
j-cc.seq:ISA Check Succeeds
poptest.seq:ISA Check Succeeds
prog1.seq:ISA Check Succeeds
prog2.seq:ISA Check Succeeds
prog3.seq:ISA Check Succeeds
prog4.seq:ISA Check Succeeds
prog5.seq:ISA Check Succeeds
prog6.seq:ISA Check Succeeds
prog7.seq:ISA Check Succeeds
prog8.seq:ISA Check Succeeds
pushquestion.seq:ISA Check Succeeds
pushtest.seq:ISA Check Succeeds
ret-hazard.seq:ISA Check Succeeds
rm asum.seq asumr.seq cjr.seq j-cc.seq poptest.seq pushquestion.seq pushtest.seq prog1.seq prog2.seq prog3.seq prog4.seq prog5.seq prog6.seq prog7.seq prog8.seq ret-hazard.seq
測試iaddq 指令:
make SIM=…/seq/ssim TFLAGS=-i
匯編
irmovq 指令
irmovq指令是x86匯編語言中的一條指令,用于將立即數(即常數)加載到寄存器中。這個指令主要用于將一個立即數加載到目標寄存器中,而不是從內存中讀取數據。
irmovq指令的具體格式如下:
irmovq 立即數, 寄存器
其中立即數表示要加載到寄存器的常數值,寄存器表示要將常數加載到的目標寄存器。
舉個例子,如果我們要將立即數0x123456789abcdef0加載到寄存器%rdx中,我們可以使用irmovq指令:
irmovq $0x123456789abcdef0, %rdx
這條指令的作用是將立即數0x123456789abcdef0加載到寄存器%rdx中。
需要注意的是,irmovq指令是x86匯編語言中的一條特定指令,具體的用法和語法可能會因為不同的處理器架構或者匯編語言規范而有所不
同。
mrmovq 指令
mrmovq指令是x86匯編語言中的一條指令,用于將內存中的數據加載到寄存器中。這個指令主要用于從內存中讀取數據,然后將其加載到寄存器中。
mrmovq指令的具體格式如下:
mrmovq 地址, 寄存器
其中地址表示要讀取數據的內存地址,寄存器表示要將讀取的數據加載到的目標寄存器。
舉個例子,如果我們要將內存地址0xf7bdc0c3處的數據加載到寄存器%rax中,我們可以使用mrmovq指令:
mrmovq 0xf7bdc0c3, %rax
這條指令的作用是將內存地址0xf7bdc0c3處的數據加載到寄存器%rax中。
需要注意的是,mrmovq指令是x86匯編語言中的一條特定指令,具體的用法和語法可能會因為不同的處理器架構或者匯編語言規范而有所不同。
環境問題
gcc 找不到 lfl
yum install flex
yum install flex-devel