0

所以...我的老师要求我们制作一个在 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 突然出现,并且在执行过程中停止了。

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

4

1 回答 1

0

输入程序看起来一点也不像 Y86 程序。相反,它看起来像是使用 gcc -c 指令生成的东西。

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

于 2012-11-08T04:03:57.383 回答