2012-07-10 195 views
0

因此......我的老师要求我们在我们的Y86模拟器中运行pong游戏,并且他给了我们一个汇编编译器和连接器来创建二进制文件。问题在于模拟器不断调用全局变量,在代码中间放置NONS等。模拟器和编译器一直工作得很好,我不知道问题出在代码还是编译器中。Y86汇编代码编译问题

编译器开启此

.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 

进入这个

# _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 

当我试图在它不停地打电话给一个全局变量模拟器中运行它,很多NOP的出现从哪儿冒出来有在执行过程中暂停。

你认为问题出在编译器中吗?

+0

难道你不需要在代码中实际编写像'_main:'这样的标签吗?我期望'.global _main'只告诉汇编程序'_main'将成为一个全局符号,除此之外,我不希望它为你定义'_main'。 – 2012-07-10 06:51:20

回答

0

输入程序根本不像Y86程序。相反,它看起来像是使用gcc -c指令生成的。

Y86的功能非常有限,并且不支持您的代码中显示的大多数指令。

+0

您的链接不直接与*问题相关,也不应该发布 - 尤其是没有披露。我正在删除它。 – 2012-11-08 04:15:17