Мари не печатает окончательный вывод

Я пишу код для умножения трех чисел.

A x B x C = Z Вы должны ввести все начальные значения. Существует также переменная вреда P. Вы вводите в этом порядке A B C Z P... A B & C может быть любым. Z вводится как 0, а P как 1. (Если вы можете показать мне, как просто установить их начальные значения, это тоже было бы здорово.)

Моя настоящая проблема в том, что когда я иду к выводу Z в конце программы, он либо печатает пробел, либо x. Любая помощь будет принята с благодарностью.

ORG 100
INPUT       /USER INPUT VARIABLE 
STORE   A   /STORE IN MEM LOCATION
OUTPUT      /SHOW WHAT USER ENTERED
INPUT       /USER INPUT VARIABLE            
STORE   B   /VARIABLE B
OUTPUT
INPUT       /VARIABLE C         
STORE   C
OUTPUT
INPUT
STORE   Z
OUTPUT
INPUT
STORE   P  
OUTPUT  
LOOP,   LOAD    Z   /START LOOP TO ACCUMULATE A  
    ADD A  
    STORE   Z  
    LOAD    B  
    SUBT    P   /DECRIMENT VARIABLE B  
    STORE   B  
    SKIPCOND    01  /CHECK IF B = 0  
    JUMP    LOOP    /REPEAT LOOP UNTIL B = 0  
LOOP2,  LOAD    Z  
    ADD A  
    STORE   Z  
    LOAD    C   
    SUBT    P   /DECRIMENT C  
    STORE   C  
    SKIPCOND    01  / CHECK IF C = 0  
    JUMP    LOOP2   /REPEAT LOOP UNTIL C = 0  
    CLEAR  
    LOAD    A  
    STORE   A  
    CLEAR  
    LOAD    Z  
    STORE   Z  
    OUTPUT      /DON'T KNOW WHY IT WON'T PRINT  
    HALT  

A, DEC 0

B, DEC 0

C, DEC 0

Z, DEC 0

P, DEC 0

1 ответ

К сожалению, я опоздал на этот вопрос более чем на полтора месяца, поэтому вам, возможно, больше не понадобится помощь, но я считаю, что ваша проблема на самом деле довольно проста. Похоже, у вас скорее всего установлен режим вывода ASCII (по умолчанию) вместо десятичного (декабрь). Смотрите скриншоты ниже:

комбинированный список для вывода в MARIE Simulator

Также убедитесь, что вы выбрали правильный тип ввода, иначе ваши ответы, скорее всего, будут неправильными:

комбинированный список для ввода в MARIE Simulator

Что касается того, как вы можете установить их начальные значения, вы на самом деле уже делаете это, включая следующее:

A, DEC 0
B, DEC 0
C, DEC 0
Z, DEC 0
P, DEC 0

Эти строки инициализируют значения до нуля изначально. Поэтому, если P и Z должны быть равны нулю и на самом деле не требуют ввода пользователя, вы можете просто пропустить получение пользователем ввода для них. Однако, если вы хотите сбросить значения, вы можете просто сделать следующее:

/ ... Some stuff going on before you want to reset the values...
Clear / This will reset the value in AC to 0.
Store P  / Store current AC Value (0) in memory at P
Store Z  / Store current AC Value (0) in memory at Z
/ ... Store it wherever you want to reset values to Zero
/ Proceed with the rest of your program now that the values are reset.

/ And down at the bottom like normal:
A, DEC 0
B, DEC 0
C, DEC 0
Z, DEC 0
P, DEC 0

Одна вещь, которую я обычно люблю делать, это настроить подпрограмму для сброса всей памяти. Итак, я бы создал что-то вроде следующего:

TempAcValStorage, Dec 0 / Used to preserve value on AC so it is not lost when clearing
InitializeVals, HEX 0
    Store TempAcValStorage / Store current AC val
    CLEAR    / Set value of AC to 0
    STORE A  / Store 0 in variable
    STORE B  / Store 0 in next variable
    STORE C  / ...
    STORE Z
    STORE P  / Store 0 in last variable
    Load TempAcValStorage / Restore whatever was on AC
    JumpI InitializeVals


/ ... Futher down in my code when I need to initialize or reset my
/ values, I just execute a Jump-and-Store for InitializeVals:
    JnS InitializeVals

Преимущество этой подпрограммы состоит в том, что она сохраняет значение в контроллере переменного тока, поэтому вы не потеряете его при сбросе значений всех ваших сохраненных переменных.

Другие вопросы по тегам