Программирование на Ассемблере под DOS

Прежде всего посмотрите на процедуру


Прежде всего посмотрите на процедуру WRITE_HEX_DIGIT и вспомните, какой алгоритм положен в основу ее работы. Вспомнили? Рад за вас!!
  А теперь мы познакомимся к командой деления. Что будем делить?? Ну естественно, "регистры" :).

  Новая команда называется "деление беззнаковое" (DIVide unsigned).
  Что такое делимое/делитель/частное, я вас грузить не буду, это в учебнике арифметики для младших классов более чем понятно расжевано. Ну во всяком случае детишки это понимают.
  (Кто скажет, что 10/3=3 а остаток 333 в периоде - тот дурак. Кто скажет, что остаток будет равен 1, скажет правильно.)

  Следующий кусок кода демонстрирует деление значения регистра AX на значение регистра BL. mov ax,10d mov bl,3d div bl
  Обратите внимание: ДЕЛИМОЕ у нас может располагаться только в регистре AX (другими словами, делимое задается неявно), а ДЕЛИТЕЛЬ - в любом регистре.
  Кто не верит - посмотрите под отладчиком...

  1. Если делитель размером в байт, то после операции частное помещается в AL, а остаток - в AH.
  2. Если делитель размером в слово, то делимое должно быть расположено в паре регистров DX:AX (младшая часть делимого в AX). После операции частное помещается в AX, а остаток - в DX.
  2. Если делитель размером в двойное слово, то делимое должно быть расположено в паре регистров EDX:EAX (младшая часть делимого находится в EAX.) После операции частное помещается в EAX, а остаток - в EDX.

  Внимание, подводный камень! В следующем примере: mov ax,10d mov bx,3d div bx
  у вас вовсе не AX на BX делиться будет, а парочка DX:AX на BX.
  Помедитируйте над этим :))

 

Содержание раздела