将值分配给二维数组时的垃圾值

时间:2012-10-18 20:25:47

标签: arrays assembly x86 att ia-32

我对程序集完全不熟悉,在为二维“数组”赋值时遇到了问题。我的数组是名为.space的{​​{1}},并且已分配screen,因此有足够的空间。

在我执行下面的命令之前,数组只包含HEIGHT * WIDTH * 4个值(我知道这一点,因为在发出下面的命令之前,我循环遍历数组并将所有值设置为0,并通过打印验证它超出所有价值观。)

这就是我的所作所为:

0

这就是它产生的结果(列出所有行和列时):

movl $0, %eax
movl $1, %ebx
movl $20, screen(%eax, %ebx, 4)

我期待的只是看到x:0 y:0 value:0 x:0 y:1 value:20 x:0 y:2 value:0 x:0 y:3 value:0 x:0 y:4 value:0 x:1 y:0 value:335544320 x:1 y:1 value:0 x:1 y:2 value:0 x:1 y:3 value:0 x:1 y:4 value:0 x:2 y:0 value:1310720 x:2 y:1 value:0 x:2 y:2 value:0 x:2 y:3 value:0 x:2 y:4 value:0 x:3 y:0 value:5120 x:3 y:1 value:0 x:3 y:2 value:0 x:3 y:3 value:0 x:3 y:4 value:0 x:4 y:0 value:20 x:4 y:1 value:0 x:4 y:2 value:0 x:4 y:3 value:0 x:4 y:4 value:0 screen[0][1]的变化。是什么导致了这些“垃圾”值(x:0 y:1 value:203355443201310720等?

正如我所提到的,我是一个完全的初学者,所以要好心!

修改 我正在提供零填充功能和列出数组中所有值的功能。

5120

编辑2 : 在Andreas的输入之后,我做了这个功能:

HEIGHT = 5
WIDTH = 5
EMPTY = 0

.section .data
counter: .int 0
counter2: .int 0

str3: .string "x:%d y:%d value:%d\n"

.section .text
#################################
# Fill screen array with zeroes
init_screen:
#################################
movl    $0, counter
init_screen_array_x:

    movl    $0, counter2
init_screen_array_y:
    movl    counter, %ebx
    movl    counter2, %ecx
    movl    $EMPTY, screen(%ebx, %ecx, 4)

    incl    counter2
    cmpl    $HEIGHT, counter2
    jl  init_screen_array_y

    incl    counter
    cmpl    $WIDTH, counter
    jl  init_screen_array_x

    ret
#################################
# end init_screen
#################################

#################################
# Debugging function, list all values in array
list_screen_array:
#################################
movl    $0, counter
list_screen_array_x:

    movl    $0, counter2
list_screen_array_y:
    movl    counter, %ebx
    movl    counter2, %ecx

    pushl   screen(%ebx, %ecx, 4)
    pushl   counter2
    pushl   counter
    pushl   $str3
    call    printf
    addl    $16, %esp

    incl    counter2
    cmpl    $HEIGHT, counter2
    jl  list_screen_array_y

    incl    counter
    cmpl    $WIDTH, counter
    jl  list_screen_array_x

    ret
#################################
# end list_screen
#################################

编辑3 还有一些不对的东西。现在这样做:

# x should be stored in %eax
# y should be stored in %ebx
# saves address to screen[%eax][%ebx] in %eax
screen_get_address:
    imull $4, %eax
    imull $4, %ebx
    imull $WIDTH, %ebx
    addl %ebx, %eax
    addl screen, %eax
    ret

我得到(3x3阵列):

movl $0, %eax
movl $2, %ebx
call screen_get_address
movl $20, (%eax)

1 个答案:

答案 0 :(得分:1)

您计算地址的代码是错误的。 要访问2D双字阵列的(%ebx = x,%ecx = y)元素,您需要访问

中的数据
 screen + 4*(%ecx*WIDTH + %ebx)

您正在访问屏幕(%ebx,%ecx,4),这是

screen + %ebx + 4*%ecx

即。错误的立场。在您的movl指令之前,您必须首先生成地址(例如,使用MUL,或者,如果WIDTH是2的幂,则使用移位指令)。如果您只想循环遍历所有元素,则可以通过仅使用一个连续递增的单个指针来节省复杂的地址计算。