Вау, это очень ... ограничено ... CPU :-) Без инструкции and
может возникнуть необходимость сделать divide
(на два) значения, затем multiply
(на два) этого результата.
Если предположить, что divide
является целочисленной операцией, то половинное значение будет округлено или усечено, если исходное значение было нечетным, например,и 4
, и 5
делятся пополам до 2
, а затем удваиваются, что дает 4
.
Следовательно, результат этой операции, равной половине, затем удвоенной, будет идентичен исходному значению, если это значение было четнымв противном случае он будет отличаться.
Таким образом, вы можете использовать subtract
и jmpn
для выбора четного или нечетного пути к коду.
Другими словами, что-то вроде этого:
Start: read // read to accumulator and store.
store Orig
divide Two // round to even then subtract original.
multiply Two
subtract Orig
jmpn WasOdd // Choose even/odd code path.
WasEven: ...
jump Done
WasOdd: ...
Done: stop
Orig: .data 2 0 // For original data.
Two: .data 2 2 // For halving/doubling.
Имейте в виду, что это не проверено, но это , вероятно, хорошее место для начала.Я особенно не уверен в псевдооперации .data
, но, основываясь на примере кода, намерение состоит в том, чтобы предоставить размер (количество байтов) и начальное значение.Если я неправильно понял, как это работает, вам нужно будет подстроиться под это.