2015-12-01 4 views
1

меня интересует в этом блоке кода, из https://github.com/delucas/sudoku-project/blob/master/sudoku-assembler-mips/sudokiller.s#L158Где это значение пришел от этого в реализации решатель судоку в MIPS ассемблере

# 3x3-Box check 
div  $t0, $a1, 3   # $t0 = row/3 
mul  $t0, $t0, 27   # Offset of the row ->>> Where does the 27 come from? 
div  $t1, $a2, 3   # $t1 = col/3 
mul  $t1, $t1, 3   # Offset of the column 
add  $t1, $t0, $t1   # Offset of the first cell in the box 

Я пытаюсь понять, что мы делаем здесь, но Я смущен тем, что значение числа 27.

+0

Вы можете разделить на 3 [с умножением и сдвигом вправо] (http://stackoverflow.com/a/171369/224132). Это будет быстрее, чем 'div' на большинстве машин. –

+0

@PeterCordes За счет некоторой удобочитаемости, конечно, – qwr

+0

@qwr: вы должны иметь возможность обернуть его в макрос ассемблера для удобства чтения. Кроме того, это то, о чем комментируют в asm. –

ответ

2

Плата представляет собой двумерный массив, поэтому, например, board[2][2] переводится на board[2*9+2]. Код для строки эквивалентен (t0/3)*27, который выравнивает номер строки до (первого числа) своего окна, а затем эффективно умножает на 9, правильно индексируя строку.

+0

Как бы это отличалось, если мы проверяли коробку размером 3x2 (2 строки, 3 колоса). Для платы 6x6. –

+0

@TalenKylon Ну сначала, если предположить, что он пронумерован по строкам, вы выровняете его с углом коробки (есть 2 коробки), а затем умножьте его на размер доски '(t0/2) * 12'. – qwr