2012-07-10 3 views
0

그래서 ... 선생님이 Y86 시뮬레이터에서 실행되는 탁구 게임을 만들어달라고 요청한 결과 어셈블리 컴파일러와 링커에서 바이너리 파일을 만들었습니다. 문제는 시뮬레이터가 전역 변수를 호출하고, 코드 중간에 nops를 넣는 등입니다. 시뮬레이터와 컴파일러는 현재까지 잘 작동했으며 문제가 코드 또는 컴파일러에 있는지 여부를 알지 못합니다. 내가 그것을 전역 변수를 호출 유지 시뮬레이터에서 실행하려고 할 때Y86 어셈블리 코드 컴파일 문제

이 컴파일러는이

# _int0 00000000 
# _int1 00000005 
# _int2 0000000a 
# _int3 0000000f 
# _jilix_init 00000023 
# _jilix_schedule 00000036 
# _jilix_thread 00000095 
# pid 0000019d 
# next 000001a1 
# ESP 000001c9 
# _main 000000fe 
# _produtor 0000015d 
# _consumidor 0000017d 
# changeador 000001f1 
@ 0000 
70 
14 
00 
00 
00 
70 
20 
00 
00 
00 
70 
21 
00 
00 
00 
70 
22 
00 
00 
00 
30 
84 
ff 
ff 
0f 
00 
80 
fe 
00 
00 
00 
10 
90 
10 
10 
63 
00 
40 
00 
a1 
01 
00 
00 
90 
80 
36 
00 
00 
00 
70 
2c 
00 
00 
00 
a0 
58 
a0 
08 
a0 
38 
a0 
18 
a0 
28 
a0 
68 
a0 
78 
a0 
00 
63 
00 
50 
00 
9d 
01 
00 
00 
30 
81 
02 
00 
00 
00 
68 
10 
40 
40 
c9 
01 
00 
00 
63 
00 
50 
00 
9d 
01 
00 
00 
68 
10 
50 
00 
a1 
01 
00 
00 
63 
33 
40 
03 
9d 
01 
00 
00 
63 
00 
50 
00 
9d 
01 
00 
00 
68 
10 
50 
40 
c9 
01 
00 
00 
b0 
00 
b0 
78 
b0 
68 
b0 
28 
b0 
18 
b0 
38 
b0 
08 
b0 
58 
90 
a0 
58 
20 
45 
50 
65 
08 
00 
00 
00 
50 
75 
0c  
00 
00 
00  
20 
70 
30 
83 
36 
00 
00 
00 
61 
30 
20 
63 
30 
81 
02 
00 
00 
00 
68 
13 
40 
03 
c9 
01 
00 
00 
63 
33 
20 
60 
50 
33 
9d 
01 
00 
00 
30 
81 
02 
00 
00 
00 
68 
10 
68 
13 
50 
23 
a1 
01 
00 
00 
40 
20 
a1 
01 
00 
00 
40 
63 
a1 
01 
00 
00 
63 
00 
50 
15 
10 
00 
00 
00 
30 
83 
36 
00 
00 
00 
61 
37 
40 
14 
00 
00 
00 
00 
b0 
58 
90 
63 
11 
30 
80 
05 
00 
00 
00 
40 
01 
f1 
01 
00 
00 
80 
23 
00 
00 
00 
30 
80 
5d 
01 
00 
00 
a0 
08  
30 
80 
00 
10 
00 
00 
a0  
08 
30 
80 
01 
00 
00 
00 
a0 
08 
80 
95  
00 
00  
00 
30 
81 
12 
00 
00 
00 
60 
14 
30 
80 
7d 
01 
00 
00 
a0 
08 
30 
80 
d0 
07 
00 
00 
a0 
08 
30 
80 
02 
00 
00 
00 
a0 
08  
80 
95 
00 
00 
00 
80 
36 
00 
00 
00 
70 
53 
01 
00 
00 
63 
00 
30 
83 
07 
00 
00 
00 
50  
10 
f1 
01 
00 
00 
60 
31 
40 
10 
f1 
01 
00 
00 
80 
36 
00 
00 
00 
70 
73 
01 
00 
00 
63 
00 
30  
83 
03 
00  
00 
00 
50 
10 
f1 
01 
00 
00 
61 
31 
40 
10 
f1 
01 
00  
00 
80 
36 
00 
00 
00 
70 
93 
01 
00 
00 
@ 019d 
00 
00 
00 
00 
00  
00 
00 
00 
00 
00 
00 
00 
00 
00 
00 
00 
00 
00 
00 
00 
00  
00 
00 
00 
00 
00 
00 
00 
00 
00 
00 
00 
00 
00 
00 
00 
00 
00 
00 
00 
00 
00 
00 
00 
00 
00 
00 
00 
00 
00 
00 
00 
00 
00 
00 
00 
00 
00 
00 
00 
00 
00 
00 
00  
00 
00 
00 
00 
00 
00 
00 
00 
00 
00 
00 
00 
00  
00 
00 
00 
00 
00 
00 
00 
00 
00 
00 
00 

속으로이

.module m0 

.pseg 

.global _main 

pushl %ebp 
rrmovl %esp, %ebp 
irmovl -16, %ebx 
andl %ebx, %esp 
irmovl tela, %edi 
.L45: 
call _repreenche 
call _preenche_matriz 
call _AI 
call _move_objs 
call _coli_barra 
call _coli_bola 
;call _limpa 
;call _imprime 
call _delay 
jmp .L45 

.global _preenche_matriz 
pushl %ebp 
rrmovl %esp, %ebp 
xorl %ebx, %ebx 
rmmovl %ebx, i(%ebx) 
jmp .L11 
.L12: 
xorl %ebx, %ebx 
mrmovl pos_barra1(%ebx), %edx 
mrmovl i(%ebx), %eax 
addl %eax, %edx 
rrmovl %edx, %eax 
irmovl 2, %ebx 
shll %ebx, %eax 
addl %edx, %eax 
irmovl 3, %ebx 
shll %ebx, %eax 

;addl $tela, %eax 
;inicio 
irmovl tela, %ebx 
addl %ebx, %eax 
;fim 
;movb $124, (%eax) 
;inicio 
mrmovl 0(%eax), %ecx 
irmovl $00FFFFFF, %ebx 
andl %ebx, %ecx 
irmovl 124, %ebx 
irmovl 24, %esi 
shll %esi, %ebx 
orl %ebx, %ecx 
rmmovl %ecx, 0(%eax) 
;fim 
xorl %ebx, %ebx 
mrmovl pos_barra2(%ebx), %edx 
mrmovl i(%ebx), %eax 
addl %eax, %edx 
rrmovl %edx, %eax 
irmovl 2, %ebx 
shll %ebx, %eax 
addl %edx, %eax 
irmovl 3, %ebx 
shll %ebx, %eax 

;addl $tela+39, %eax 
;inicio 
irmovl tela, %ebx 
irmovl 39, %esi 
addl %ebx, %esi 
addl %esi, %eax 
;fim 

;movb $124, (%eax) 
;inicio 
mrmovl 0(%eax), %ecx 
irmovl $00FFFFFF, %ebx 
andl %ebx, %ecx 
irmovl 124, %ebx 
irmovl 24, %esi 
shll %esi, %ebx 
orl %ebx, %ecx 
rmmovl %ecx, 0(%eax) 
;fim 

xorl %ebx, %ebx 
mrmovl i(%ebx), %eax 
irmovl 1, %ebx 
addl %ebx, %eax 
xorl %ebx, %ebx 
rmmovl %eax, i(%ebx) 
.L11: 
xorl %ebx, %ebx 
mrmovl i(%ebx), %eax 
irmovl 4, %ebx 
rrmovl %eax, %esi 
subl %ebx, %esi 
jle .L12 
xorl %ebx, %ebx 
mrmovl posy_bola(%ebx), %edx 
mrmovl posx_bola(%ebx), %ecx 
rrmovl %edx, %eax 
irmovl 2, %ebx 
shll %ebx, %eax 
addl %edx, %eax 
irmovl 3, %ebx 
shll %ebx, %eax 
addl %ecx, %eax 
irmovl tela, %ebx 
addl %ebx, %eax 
;movb $67, (%eax) 
;inicio 
mrmovl 0(%eax), %ecx 
irmovl $00FFFFFF, %ebx 
andl %ebx, %ecx 
irmovl 67, %ebx 
irmovl 24, %esi 
shll %esi, %ebx 
orl %ebx, %ecx 
rmmovl %ecx, 0(%eax) 
;fim 
popl %ebp 
ret 

.global _move_objs 
;vetor, id => globais 

;vetor[id] = 69 
;irmovl $69, %edx ;move 69 para edx 
;xorl %eax, %eax   ;zera eax 
;mrmovl id(%eax), %eax ;move id para eax 
;irmovl $2, %ebx   ;move 2 para ebx 
;shll %ebx, %eax   ;multiplica id por 4, tornando-o um indice de inteiros  
;rmmovl %edx, vetor(%eax) ;atribui 

;;pos_barra1 = vel_barra1 + pos_barra1 
xorl %eax, %eax 
mrmovl vel_barra1(%eax), %eax 
xorl %ecx, %ecx 
mrmovl pos_barra1(%ecx), %ecx 
addl %eax, %ecx 
xorl %eax, %eax 
rmmovl %ecx, pos_barra1(%eax) 

;;pos_barra2 = vel_barra2 + pos_barra2 
xorl %eax, %eax 
mrmovl vel_barra2(%eax), %eax 
xorl %ecx, %ecx 
mrmovl pos_barra2(%ecx), %ecx 
addl %eax, %ecx 
xorl %eax, %eax 
rmmovl %ecx, pos_barra2(%eax) 

;;posx_bola = velx_bola + posx_bola 
xorl %eax, %eax 
mrmovl velx_bola(%eax), %eax 
xorl %ecx, %ecx 
mrmovl posx_bola(%ecx), %ecx 
addl %eax, %ecx 
xorl %eax, %eax 
rmmovl %ecx, posx_bola(%eax) 

;;posy_bola = vely_bola + posy_bola 
xorl %eax, %eax 
mrmovl vely_bola(%eax), %eax 
xorl %ecx, %ecx 
mrmovl posy_bola(%ecx), %ecx 
addl %eax, %ecx 
xorl %eax, %eax 
rmmovl %ecx, posy_bola(%eax) 

ret 

.global _delay 
irmovl 10000000, %eax 
.L41: 
irmovl 1, %edx 
subl %edx, %eax 
jne .L41 

ret 

.global _coli_barra 
xorl %edx, %edx 
mrmovl pos_barra1(%edx), %ecx 
subl %edx, %ecx 
jg .L24 
xorl %edx, %edx 
irmovl 1, %ecx 
rmmovl %ecx, pos_barra1(%edx) 
.L24: 

xorl %edx, %edx 
mrmovl pos_barra2(%edx), %ecx 
subl %edx, %ecx 
jg .L25 
xorl %edx, %edx 
irmovl 1, %ecx 
rmmovl %ecx, pos_barra2(%edx) 
.L25: 
xorl %edx, %edx 
mrmovl pos_barra1(%edx), %eax 
irmovl 5, %ecx 
addl %ecx, %eax 
irmovl 18, %ecx 
rrmovl %eax, %edx 
subl %ecx, %edx 
jle .L26 
xorl %edx, %edx 
irmovl 14, %ecx 
rmmovl %ecx, pos_barra1(%edx) 
.L26: 
xorl %edx, %edx 
mrmovl pos_barra2(%edx), %eax 
irmovl 5, %ecx 
addl %ecx, %eax 
irmovl 18, %ecx 
rrmovl %eax, %edx 
subl %ecx, %edx 
jle .L23 
xorl %edx, %edx 
irmovl 14, %ecx 
rmmovl %ecx, pos_barra2(%edx) 
.L23: 
;rep 
ret 


.global _coli_bola 
irmovl 28, %edx 
subl %edx, %esp 
xorl %edx, %edx 
mrmovl posy_bola(%edx), %eax 

andl %eax, %eax 
jg .L29 
xorl %edx, %edx 
mrmovl vely_bola(%edx), %ecx 
;negl %ecx 
;inicio 
xorl %ebx, %ebx 
subl %ecx, %ebx 
rrmovl %ebx, %ecx 
;fim 
rmmovl %ecx, vely_bola(%edx) 

irmovl 2, %edx 
subl %eax, %edx 
xorl %ecx, %ecx 
rmmovl %edx, posy_bola(%ecx) 
jmp .L30 
.L29: 
irmovl 18, %edx 
rrmovl %eax, %ecx 
subl %edx, %ecx 
jle .L30 
xorl %edx, %edx 
mrmovl vely_bola(%edx), %ecx 
;negl %ecx 
;inicio 
xorl %ebx, %ebx 
subl %ecx, %ebx 
rrmovl %ebx, %ecx 
;fim 
rmmovl %ecx, vely_bola(%edx) 
irmovl 36, %ecx 
subl %eax, %ecx 
rmmovl %ecx, posy_bola(%edx) 
.L30: 
xorl %edx, %edx 
mrmovl posx_bola(%edx), %eax 
andl %eax, %eax 
jg .L31 

mrmovl pos_barra1(%edx), %ecx 
mrmovl posy_bola(%edx), %edx 
rrmovl %ecx, %ebx 
subl %edx, %ebx 
jg .L32 

irmovl 5, %ebx 
addl %ebx, %ecx 
rrmovl %edx, %ebx 
subl %ecx, %ebx 
jg .L32 
xorl %ebx, %ebx 
mrmovl velx_bola(%ebx), %esi 
;negl %esi 
;inicio 
xorl %ebx, %ebx 
subl %esi, %ebx 
rrmovl %ebx, %esi 
;fim 
rmmovl %esi, velx_bola(%ebx) 
irmovl 2, %edx 
subl %eax, %edx 
xorl %ebx, %ebx 
rmmovl %edx, posx_bola(%ebx) 
jmp .L28 
.L32: 
xorl %ebx, %ebx 
mrmovl pontos_2(%ebx), %eax 
irmovl 1, %ebx 
addl %ebx, %eax 
xorl %ebx, %ebx 
rmmovl %eax, pontos_2(%ebx) 
irmovl 38, %ebx 
xorl %esi, %esi 
rmmovl %ebx, posx_bola(%esi) 

mrmovl pos_barra2(%esi), %eax 
rmmovl %eax, posy_bola(%esi) 
jmp .L28 
.L31: 
irmovl 38, %ebx 
rrmovl %eax, %esi 
subl %ebx, %esi 
jle .L28 
xorl %ebx, %ebx 
mrmovl pos_barra2(%ebx), %ecx 
mrmovl posy_bola(%ebx), %edx 
rrmovl %ecx, %esi 
subl %edx, %esi 
jg .L34 
irmovl 5, %esi 
addl %esi, %ecx 
rrmovl %edx, %esi 
subl %ecx, %esi 
jg .L34 
xorl %ebx, %ebx 
mrmovl velx_bola(%ebx), %esi 
;negl %esi 
;inicio 
xorl %ebx, %ebx 
subl %esi, %ebx 
rrmovl %ebx, %esi 
;fim 
rmmovl %esi, velx_bola(%ebx) 
irmovl 76, %edx 
subl %eax, %edx 
xorl %ebx, %ebx 
rmmovl %edx, posx_bola(%ebx) 
jmp .L28 
.L34: 
xorl %ebx, %ebx 
mrmovl pontos_1(%ebx), %eax 
irmovl 1, %esi 
addl %esi, %eax 
rmmovl %eax, pontos_1(%ebx) 
rmmovl %esi, posx_bola(%ebx) 
mrmovl pos_barra1(%ebx), %eax 
rmmovl %eax, posy_bola(%ebx) 
.L28: 
popl %ebp;noprintcode xorl %ebx, %ebx 
;addl $28, %esp 
ret 

.global _AI 

xorl %ebx, %ebx 
mrmovl velx_bola(%ebx), %esi 
subl %ebx, %esi 
;jns .L14 
jge .L14 
xorl %ebx, %ebx 
mrmovl pos_barra1(%ebx), %edx 
irmovl 2, %ebx 
addl %ebx, %edx 
xorl %ebx, %ebx 
mrmovl posy_bola(%ebx), %eax 
rrmovl %edx, %esi 
subl %eax, %esi 
jge .L15 
xorl %ebx, %ebx 
irmovl 1, %esi 
rmmovl %esi, vel_barra1(%ebx) 
.L15: 
rrmovl %eax, %ebx 
rrmovl %edx, %esi 
subl %ebx, %esi 
jle .L16 
xorl %ebx, %ebx 
irmovl -1, %esi 
rmmovl %esi, vel_barra1(%ebx) 
.L16: 
rrmovl %eax, %ebx 
rrmovl %edx, %esi 
subl %ebx, %esi 
jne .L17 
xorl %ebx, %ebx 
rmmovl %ebx, vel_barra1(%ebx) 
.L17: 
xorl %ebx, %ebx 
rmmovl %ebx, vel_barra2(%ebx) 
ret 
.L14: 
xorl %ebx, %ebx 
mrmovl pos_barra2(%ebx), %edx 
irmovl 2, %ebx 
addl %ebx, %edx 
xorl %ebx, %ebx 
mrmovl posy_bola(%ebx), %eax 
rrmovl %eax, %ebx 
rrmovl %edx, %esi 
subl %ebx, %esi 
jne .L19 
xorl %ebx, %ebx 
rmmovl %ebx, vel_barra2(%ebx) 
jmp .L20 
.L19: 
rrmovl %eax, %ebx 
rrmovl %edx, %esi 
subl %ebx, %esi 
jge .L21 
irmovl 1, %esi 
xorl %ebx, %ebx 
rmmovl %esi, vel_barra2(%ebx) 
.L21: 
rrmovl %eax, %ebx 
rrmovl %edx, %esi 
subl %ebx, %esi 
jle .L20 
irmovl -1, %esi 
xorl %ebx, %ebx 
rmmovl %esi, vel_barra2(%ebx) 
.L20: 
xorl %ebx, %ebx 
rmmovl %ebx, vel_barra1(%ebx) 

ret 

.global _repreenche 
pushl %ebp 
rrmovl %esp, %ebp 
irmovl 16, %ebx 
subl %ebx, %esp 
irmovl 1, %ebx 
rmmovl %ebx, -8(%ebp) 
jmp .L4 
.L7: 
xorl %ebx, %ebx 
rmmovl %ebx, -4(%ebp) 
jmp .L5 
.L6: 
mrmovl -8(%ebp), %edx 
rrmovl %edx, %eax 
irmovl 2, %ebx 
shll %ebx, %eax 
addl %edx, %eax 
irmovl 3, %ebx 
shll %ebx, %eax 
;addl -4(%ebp), %eax 
;inicio 
mrmovl -4(%ebp), %ebx 
addl %ebx, %eax 
;fim  
irmovl tela, %ebx 
addl %ebx, %eax 

;movb $32, (%eax) 
;inicio 
mrmovl 0(%eax), %ecx 
irmovl $00FFFFFF, %ebx 
andl %ebx, %ecx 
irmovl 32, %ebx 
irmovl 24, %esi 
shll %esi, %ebx 
orl %ebx, %ecx 
rmmovl %ecx, 0(%eax) 
;fim 
irmovl 1, %ebx 
mrmovl -4(%ebp), %esi 
addl %ebx, %esi 
rmmovl %esi, -4(%ebp) 
.L5: 
irmovl 39, %ebx 
mrmovl -4(%ebp), %esi 
subl %ebx, %esi 
jle .L6 
irmovl 1, %ebx 
mrmovl -8(%ebp), %esi 
addl %ebx, %esi 
rmmovl %esi, -8(%ebp) 
.L4: 
irmovl 18, %ebx 
mrmovl -8(%ebp), %esi 
subl %ebx, %esi 
jle .L7 
xorl %ebx, %ebx 
rmmovl %ebx, -8(%ebp) 
jmp .L8 
.L9: 
mrmovl -8(%ebp), %eax 
irmovl tela, %ebx 
addl %ebx, %eax 
;movb $61, (%eax) 
;inicio 
mrmovl 0(%eax), %ecx 
irmovl $00FFFFFF, %ebx 
andl %ebx, %ecx 
irmovl 61, %ebx 
irmovl 24, %esi 
shll %esi, %ebx 
orl %ebx, %ecx 
rmmovl %ecx, 0(%eax) 
;fim 
mrmovl -8(%ebp), %eax 
irmovl tela, %ebx 
irmovl 760, %esi 
addl %ebx, %esi 
addl %esi, %eax 
;movb $61, (%eax) 
;inicio 
mrmovl 0(%eax), %ecx 
irmovl $00FFFFFF, %ebx 
andl %ebx, %ecx 
irmovl 61, %ebx 
irmovl 24, %esi 
shll %esi, %ebx 
orl %ebx, %ecx 
rmmovl %ecx, 0(%eax) 
;fim 
irmovl 1, %ebx 
mrmovl -8(%ebp), %esi 
addl %ebx, %esi 
rmmovl %esi, -8(%ebp) 
.L8: 
irmovl 39, %ebx 
mrmovl -8(%ebp), %esi 
subl %ebx, %esi 
jle .L9 
rrmovl %esp, %ebp 
popl %ebp 
ret 

;variaveis globais 
.dseg 13 
.global tela 
.blk 102400 

.global i 
.blk 4 

.global j 
.blk 4 

.global pontos_1 
.blk 4 

.global pontos_2 
.blk 4 

.global posx_bola 
.blk 4 

.global posy_bola 
.blk 4 

.global velx_bola 
.blk 4 

.global vely_bola 
.blk 4 

.global pos_barra1 
.blk 4 

.global vel_barra1 
.blk 4 

.global pos_barra2 
.blk 4 

.global vel_barra2 
.blk 4 
.end 

을 전환, NOP를 많은 곳에서 등장하지 않고 있었다 실행 중간에 정지.

문제가 컴파일러에 있다고 생각합니까?

+0

코드에'_main :'과 같은 라벨을 실제로 쓸 필요가 없습니까? 나는'.global _main'이'_main'이 전역 심볼이 될 것이라고 어셈블러에만 말할 것을 기대하고 있습니다. IOW,'_main'을 정의 할 것이라고 기대하지 않습니다. –

답변

0

입력 프로그램이 Y86 프로그램처럼 보이지 않습니다. 오히려 gcc -c 지시문을 사용하여 생성 된 것과 같습니다.

Y86은 수행 할 수있는 작업이 매우 제한되어 있으며 코드에 표시되는 대부분의 지침을 지원하지 않습니다.

+0

귀하의 링크는 * 질문에 직접 관련되지 않으므로 공개하지 말아야합니다. 특히 공개하지 않아야합니다. 나는 그것을 제거하고있다. –