2014-05-09 3 views
0

Итак, у меня есть процедура, которая должна печатать массив, инициализированный символом «~». Так как я хочу игровое поле 12x12, я использую модульное деление на 144 на 12 и печатаю новую строку, когда остаток равен 0. У меня определенно есть проблема где-то, но мой первый намек в том, что он просто сбивает вторую, чтобы печатать доску ,Модульное подразделение MASM32

displayBoard PROC 
lea esi, dArray 
mov eax, 144 

.while eax > 0 
    xor edx, edx 
    mov ecx, 12 
    div ecx 
    .if edx == 0 
     print 0DH, 0AH 
    .endif 
    print esi 
    sub eax, 1 
.endw 

mov eax, input() 

displayBoard ENDP

ответ

0

Проблема заключается в том, что div инструкция устанавливает как edx и eax - он делает это:

eax := edx:eax DIV ecx 
edx := edx:eax MOD ecx 

Так перезаписывает eax регистр и разбивает свой цикл.


Кроме того, eax временный регистр и вызов print перепишет его. См. Документ ABI или соглашение о вызове для вашей целевой платформы, чтобы узнать, какие регистры и которые не сохраняются во всех вызовах функций.


Наконец, я не знаю, что print делает, но использовать его как с немедленным CR/LF значения 0DH, 0AH и esi, указатель на какой-то массив, кажется подозрительным.

+0

Хорошо, что я получил помощь, основанную на ваших комментариях. Последний вопрос, который у меня есть, заключается в том, что при использовании print esi будет напечатано всего 144 элемента в массиве. Для каждого цикла я хочу напечатать следующий элемент, который, как я предполагаю, означает, что мне нужно распечатать esi + 1, так как это массив BYTE? – user2747058

+0

Вам нужно указать «байт по адресу' esi' », который написан в синтаксисе MASM как' print byte ptr [esi] '. – Yirkha

Смежные вопросы