Сбой сравнения Mult.asm - PullRequest
0 голосов
/ 25 марта 2019

Мне нужно ответить на вопрос: почему сбой сравнения в строке 9, а не в строке 8? Я новичок в языке ассемблера Hack и все еще изучаю основы, но не понимаю, почему эмулятор процессора будет проходить строку 8, а не строку 9.

2-й вопрос:

Как я могу это исправить, чтобы поддержать умножение отрицательных значений?

Программа умножает R0 и R1 и сохраняет результат в R2. (R0, R1, R2 означают RAM [0], RAM [1] и RAM [2] соответственно.)

Mult.asm:

0   @2
1   M=0
2   @0
3   D=M
4   @8
5   D;JNE
6   @19
7   0;JMP
8   @2
9   D=M
10  @1
11  D=D+M
12  @2
13  M=D
14  @0
15  D=M-1
16  M=D
17  @8
18  D;JGT
19  @19
20  0;JMP

Mult.cmp:

|  RAM[0]  |  RAM[1]  |  RAM[2]  |
|       0  |       0  |       0  |
|       1  |       0  |       0  |
|       0  |       2  |       0  |
|       3  |       1  |       3  |
|       2  |       4  |       8  |
|       6  |       7  |      42  |
|       6  |      -7  |     -42  |
|      -6  |       7  |     -42  |

1 Ответ

0 голосов
/ 25 марта 2019

Если память служит, то сообщение об ошибке говорит о том, что вы не проходите тест в строке 9 Mult.cmp.

Итак, предполагая, что тестовый скрипт в Mult.tst правильный, проблема в том, что ваша программа не работает, когда первое число (R0) изначально отрицательно.

В строках 14-18 вы уменьшаете R0 и возвращаетесь к строке 8, если она> 0. Это немедленно потерпит неудачу, потому что R0 начинает отрицательно!

Вам нужно иметь немного дополнительного кода в начале, чтобы проверить этот случай и внести соответствующие корректировки.

Кроме того, предложение стиля. При обращении к ячейке памяти используйте символьную нотацию, например: @ R1 вместо @ 1, и, в частности, используйте нотацию (LABEL) для указания целей прыжка. Это сделает ваш код намного проще для чтения и изменения.

Удачи!

...