Чтобы ответить на заглавный вопрос: да, используйте комментарии, чтобы описать, какая логическая «переменная» будет в каком регистре для блока кода.И документируйте входы / выходы / clobbers для каждой функции.Как ;;; input: ds:si pointer to a 0-terminated string
в некоторой гипотетической функции (не этой).Внутри функции для временных сообщений снова прокомментируйте место, где вы что-то вычисляете.
Если вы читаете чужой плохо документированный код, вы можете добавить таких комментариев вверхублок, после просмотра его, чтобы увидеть, если что-то меняет определенный регистр.(Это нетривиально, когда есть вызовы функций, о которых вы не знаете, какие регистры они перекрывают. Использование стандартных соглашений о вызовах делает это намного проще, потому что вы знаете, какие регистры предполагать, что они засорены.)
Как указывает Шут, это stos
, а не movs
, поэтому он не читает DS:SI
.Он сохраняет только AX и AL в ES:DI
( Intel docs ).Однако этот код выглядит неработоспособным: он устанавливает DS
, но не ES
прямо перед этим, как если бы он ожидал, что STOS будет использовать DS:DI
(чего не происходит).
Возможно, он работает впопрактикуйтесь, потому что SETMEM
не на самом деле clobber ES
, или не установите для него значение, которое этот код все равно хотел.Но из assume ES:NOTHING
после вызова SETMEM
похоже, что этот код ожидает SETMEM
уничтожения ES
.
Я предполагаю, что этот код взят из DOS 1.0, который вы искалив, так что, предположительно, ES
все еще фактически равен CS
от толчка / удара в верхней части этого блока, по счастливой случайности или что-то в этом роде.
Это тот случай, когда он пошаговов отладчике может помочь понять это. Я думаю, что встроенный отладчик BOCHS позволяет вам устанавливать точки останова где угодно, даже в коде ОС, и они работают даже с отключенными прерываниями.
Во всяком случае, есть ограничения на использование комментариев, когда все становится сложным.
Именно поэтому в реальной жизни мы оставляем оптимизацию на большие расстояния / масштабирование / постоянное распространение для компиляторов (которые превосходны при , ) и в основном беспокоятся только об микрооптимизации asm для горячих циклов (где компиляторы не всегда хороши).