Krótko i do rzeczy: Zastanawiam się czy dobrze rozumiem wielowymiarowe tablice w ASM? [NASM 32bit konkretnie]
Zrobiłem dla testu coś takiego:
global _main
extern _printf
extern _scanf
section .data
tab dd 1, 11, 12, 13, 2, 21, 22, 23, 3, 31, 32, 33
fmt db "%d ", 0
nl db 0ah, 0dh
section .bss
i resd 1
j resd 1
offset_1 resd 1
offset_2 resd 1
section .text
_main:
mov ebp, esp; for correct debugging
mov dword[i], 0
mov dword[j], 0
mov dword[offset_1], 0
mov dword[offset_2], 4
pierwsza:
mov edi, dword[offset_1]
push dword[tab+edi+esi]
push fmt
call _printf
add esp, 8
mov dword[j], 0
druga:
mov esi, dword[offset_2]
push dword[tab+edi+esi]
push fmt
call _printf
add esp, 8
mov dword[offset_2], esi
add dword[offset_2], 4
inc dword[j]
cmp dword[j], 3
jne druga
push nl
call _printf
add esp, 4
mov dword[offset_1], edi
add dword[offset_1], 4
inc dword[i]
cmp dword[i], 3
jne pierwsza
koniec:
xor eax, eax
ret
Tab to tak naprawdę ciągły obszar pamięci ale cyfry 1, 2 oraz 3 oznaczają wiersze w tablicy 2D. Dwucyfrowe wartości to wartości kolumn tablicy 2D.
I teraz tak: skoro to jest ciągły obszar pamięci to tak naprawdę tablice wielowymiarowe można sobie implementować wedle uznania operując jedynie offsetami przesuwającymi kolumny i wiersze. :) Właściwie jak wskaźniki tablicowe w C (stąd to się przecież wzięło).
Pytanie początkującego asmowca: czy dobrze to rozumiem? :)