Реклама:

Следующий пример в подробностях демонстрирует механизм отображения регистров, а также один из "подводных камней" операции умножения по версии процессора 8088. Часть программы genReg.s, начиная с метки start, представлена в листинге В.2, а на рис. В.6 показана секция регистров окна трассера после выполнения строки 7.

Листинг В.2. Часть программы genReg.s

Рис. В.6. Секция регистров окна трассера: после выполнения строки 7 (а); после семи проходов цикла умножения (б)

Регистры общего назначения-b

Следующая команда в строке 4 загружает в регистр АХ значение 258:

M0V АХ,258

В результате регистр АН получает значение 1, а регистр AL - 2. Далее, в строке 5, значения AL и АН суммируются, и значение АН оказывается равным трем. В строке 6 в СХ копируется содержимое переменной times (10). В строке 7 в регистр ВХ загружается адрес переменной muldat, равный 2, поскольку она находится во втором байте секции данных. Именно в этот момент сделан снимок экрана, представленный на рис. В.6, а. Следует иметь в виду, что значение АН составляет 3, значение AL - 2, а АХ - 770; в этом нет ничего удивительного, так как 3 х 256 + 2 = 770.

Следующая команда (в строке 8) копирует содержимое переменной muldat в регистр АХ. Таким образом, после нажатия клавиши возврата каретки значение АХ изменится на 625.

Теперь мы готовы запустить цикл, призванный умножить содержимое регистра АХ на слово 2ВХ (то есть muldat + 2), в котором находится значение 2. Неявным целевым адресом для команды MUL является комбинация регистров DX : АХ. В первом проходе цикла результат (1250) умещается в одно слово, поэтому он сохраняется в регистре АХ, а значение DX остается нулевым. Содержимое всех регистров после 7 проходов цикла умножения показано на рис. В.6, б.

Так как исходным значением АХ являлось 625, после семи операций умножения на 2 результат становится равным 80 000. Поскольку он не помещается в регистр АХ, произведение сохраняется в 32-разрядном регистре, образуемом путем конкатенации регистров DX : АХ; таким образом, в DX содержится значение 1, а в АХ - 14 464. При вычислении действительно получается, что 1 х 65 536 + + 14 464 = 80 000. Обратите внимание, что значением СХ на данном этапе является 4, поскольку команда LOOP уменьшает его на единицу во время каждого прохода. Так как исходным значением этого регистра было 10, после семи вызовов команды MUL (и шести проходов команды LOOP) значение СХ уменьшилось до 4.

В ходе следующей операции умножения возникают трудности. При умножении задействуется только значение АХ, в то время как значение DX игнорируется; таким образом, команда MUL умножает АХ (14 464) на 2 и получает 28 928. То есть новым значением АХ становится 28 928, а регистр DX обнуляется, что численно неверно.

Hello World || Оглавление || Вызов регистров команд и указателя