Как уже отмечалось другими, вам нужно сместить 127 на 2 места, чтобы флаг переноса был фактически установлен. Но вы говорите, что это все еще не работает; вот мое лучшее предположение относительно того, почему:
Я не знаком с HLA и его библиотечными функциями, но, как правило, при написании ассемблера вы всегда должны предполагать, что вызов библиотечной функции может изменить флаги произвольным образом, если только нет какой-либо документации, в которой говорится иначе. Многие инструкции могут изменять флаги, поэтому, если функция библиотеки Explicity не сохранит флаги при входе и не восстановит их при выходе (например, сохраняя их в стеке с помощью инструкций pushf
и popf
), они могут оказаться в любом состоянии.
В вашем коде у вас есть вызов библиотечной процедуры stdout.put
между shl
и проверкой флага переноса:
shl(2, var); /* I'm assuming you've already changed 1 to 2 here */
stdout.put(var, nl);
if (@C) then stdout.put("carry set"); endif;
Я бы предположил, что stdout.put
очищает флаг.
Так что попробуйте поставить тест сразу после смены:
shl(2, var);
if (@C) then stdout.put("carry set", nl); endif;
stdout.put(var, nl);