所以...我的老师要求我们制作一个在 Y86 模拟器中运行的乒乓球游戏,他给了我们一个汇编编译器和链接器来创建二进制文件。问题是模拟器不断调用全局变量,在代码中间放置大量 nops,等等。模拟器和编译器到目前为止工作正常,我不知道问题出在代码还是编译器上。
编译器把这个
.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
当我试图在模拟器中运行它时,它一直在调用一个全局变量,很多 nops 突然出现,并且在执行过程中停止了。
你认为问题出在编译器上吗?