汇编指令(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
iReg = 0
pReg = 0
ZF = 0
SF = 0
OF = 0
reg[4] = 10000
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
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]®[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
'''