Y86-64模拟器(python实现1~100求和)

汇编指令(1~100求和)
xorq %rax,%rax
xorq %rbx,%rbx
irmovq $1,%r8
irmovq $100,%r9
for: addq %r8,%rbx
addq %rbx,%rax
rrmovq %rbx,%rdx
subq %r9,%rdx
jne for
rmmovq %rax,0(%r9)
halt
机器代码
000 6300
002 6333
004 30F80100000000000000
00E 30F96400000000000000
018 6083
01A 6030
01C 2032
01E 6192
020 741800000000000000
029 40090000000000000000
033 00

python代码

mem = [0]*10010    #指令存储器
reg = [0]*16    #15个常用寄存器
iReg = 0    #当前指令
pReg = 0    #PC
ZF = 0   #零
SF = 0   #符号
OF = 0   #溢出

reg[4] = 10000  #%rsp栈指针


def loadProgram(file):
    global mem, reg, iReg, pReg,ZF,OF,SF
    fil = open(file,'r')
    first = True
    lineno = 0
    while True:
        line = fil.readline()   
        lineno += 1
        if line == '':
            break
        fids = line.split()
        try:
            address = int(fids[0],16)   #地址
            instruc = fids[1]   #指令
            if first:
                pReg = address    #开头
                first = False
            mem[address] = instruc 
        except:
            print(f'File {file} line {lineno} has error')
            pass
    fil.close
def imm(str):
    n = len(str)
    s =''
    for i in range(n-2,-1,-2):
        s = s+str[i:i+2]
    return s

Count = 1

def cycle():
    global mem, reg, iReg, pReg,OF,ZF,SF,Count

    iReg = mem[pReg]   #当前指令
    pReg = len(iReg)//2 + pReg    #PC+1
    opcode = iReg[0:2]
    if opcode == '00':
        return False
    elif opcode == '10':
        return True
    elif opcode == '20':
        rA = int(iReg[2],16)
        rB = int(iReg[3],16)
        reg[rB] = reg[rA]
    elif opcode == '21':
        rA = int(iReg[2],16)
        rB = int(iReg[3],16)
        if ZF or SF:
            reg[rB] = reg[rA]                  
    elif opcode == '22':
        rA = int(iReg[2],16)
        rB = int(iReg[3],16)
        if SF:
            reg[rB] = reg[rA]          
    elif opcode == '23':
        rA = int(iReg[2],16)
        rB = int(iReg[3],16)
        if ZF:
            reg[rB] = reg[rA]  
    elif opcode == '24':
        rA = int(iReg[2],16)
        rB = int(iReg[3],16)
        if not ZF:
            reg[rB] = reg[rA]  
    elif opcode == '25':
        rA = int(iReg[2],16)
        rB = int(iReg[3],16)
        if ZF or (not SF):
            reg[rB] = reg[rA]  
    elif opcode == '26':
        rA = int(iReg[2],16)
        rB = int(iReg[3],16)
        if not SF:
            reg[rB] = reg[rA]  
    elif opcode == '30':
        rB = int(iReg[3],16)
        V = int(imm(iReg[4:]),16)
        reg[rB] = V
    elif opcode == '40':
        rA = int(iReg[2],16)
        rB = int(iReg[3],16)     
        D =  int(imm(iReg[4:]),16)
        mem[reg[rB]+D] = reg[rA]         
    elif opcode == '50':
        rA = int(iReg[2],16)
        rB = int(iReg[3],16)     
        D =  int(imm(iReg[4:]),16)
        reg[rA] = mem[reg[rB]+D]           
    elif opcode == '60':
        rA = int(iReg[2],16)
        rB = int(iReg[3],16)
        flag = 0
        if reg[rA]>0 and reg[rB]>0: flag=1
        if reg[rA]<0 and reg[rB]<0: flag=2
        reg[rB] = reg[rA]+reg[rB]
        if reg[rB]==0: ZF=1
        else: ZF=0
        if reg[rB]<0: SF=1
        else: SF=0       
        if (flag==1 and reg[rB]<0) or (flag==2 and reg[rB]>0): OF=1
        else: OF=0               
    elif opcode == '61':
        rA = int(iReg[2],16)
        rB = int(iReg[3],16)
        flag = 0
        if reg[rA]>0 and reg[rB]>0: flag=1
        if reg[rA]<0 and reg[rB]<0: flag=2
        reg[rB] = reg[rB]-reg[rA]  
        if reg[rB]==0: 
            ZF=1
        else: 
            ZF=0
        if reg[rB]<0: SF=1
        else: SF=0       
        if (flag==1 and reg[rB]<0) or (flag==2 and reg[rB]>0): OF=1
        else: OF=0        
    elif opcode == '62':
        rA = int(iReg[2],16)
        rB = int(iReg[3],16)
        reg[rB] = reg[rA]&reg[rB]
        if reg[rB]==0: 
            ZF=1
        else: 
            ZF=0
        if reg[rB]<0: SF=1
        else: SF=0       
        OF=0    
    elif opcode == '63':
        rA = int(iReg[2],16)
        rB = int(iReg[3],16)
        reg[rB] = reg[rA]^reg[rB] 
        if reg[rB]==0: 
            ZF=1
        else: 
            ZF=0
        if reg[rB]<0: SF=1
        else: SF=0        
        OF=0 
    elif opcode == '70':
        pReg = int(imm(iReg[2:]),16)
    elif opcode == '71':
        if ZF or SF:
            pReg = int(imm(iReg[2:]),16)
    elif opcode == '72':
        if SF:
            pReg = int(imm(iReg[2:]),16)
    elif opcode == '73':
        if ZF:
            pReg = int(imm(iReg[2:]),16)
    elif opcode == '74':
        if not ZF:
            pReg = int(imm(iReg[2:]),16)
    elif opcode == '75':
        if ZF or (not SF):
            pReg = int(imm(iReg[2:]),16)
    elif opcode == '76':
        if not SF:
            pReg = int(imm(iReg[2:]),16)
    elif opcode == '80':
        mem[reg[4]-8] = pReg
        reg[4] = reg[4]-8
        pReg = int(imm(iReg[2:]),16)
    elif opcode == '90':
        pReg = mem[reg[4]]
        reg[4] = reg[4]+8
    elif opcode == 'A0':
        rA = int(iReg[2],16)
        mem[reg[4]-8] = reg[rA]
        reg[4] = reg[4] - 8
    elif opcode == 'B0':
        rA = int(iReg[2],16)
        reg[rA] = mem[reg[4]]
        reg[4] = reg[4]+8
    else:
        print(f'Unknow opcode {opcode}')
    return True

def run(file):
    global mem, reg, iReg, pReg,OF,SF,ZF

    loadProgram(file)

    while True:
        if not cycle():
            break

run('Y-86机器代码.txt')
print("输出寄存器%rax的值,即reg[0]:",end="")
print(reg[0])
print("将%rax的值放到地址为0x64中,输出0x64处的存储器的值,即mem[100]:",end="")
print(mem[100])

'''
Y86-64的1~100求和的指令
xorq %rax,%rax
xorq %rbx,%rbx
irmovq $1,%r8
irmovq $100,%r9
for: addq %r8,%rbx
addq %rbx,%rax
rrmovq %rbx,%rdx
subq %r9,%rdx
jne for
rmmovq %rax,0(%r9)
halt
'''
  • 9
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值