Анимация
JavaScript
|
Главная Библионтека Var = 3 mov xlat Примечания. WORD PTR Mem, 26 ; BYTE PTR [bx + di al, Var ; памяти, относительный адрес ; которой равен сумме содержимого ; ВХ и DI, АН = Mas[3] = 19 Запись в ячейку Мега ; десятичного числа 26 + 1], 26h ; Запись в ячейку Mas[4] ; шестнадцатеричного числа 26h AL = 3 Чтение содержимого массива ячейки Mas[3], AL = 19 После точки с запятой приведены комментарии. Действие комментария прекращается в конце строки. Комментарии в процессе трансляции игнорируются. Система счисления, в которой записано число, определяется буквой, указанной после его значения: b - двоичное, h - шестнадцатеричное, при отсутствии буквы число считается десятичным. Везде, где в операторах можно указать константу, можно использовать и константные выражения с использованием арифметических, логических, атрибутных операций и операций отношения. Константные выражения вычисляются во время трансляции исходного текста. Выделение памяти для данных различной длины обеспечивается с помощью директив DB (Define Byte), DW (Define Word), DD (Define Double), DUP (Duplicate). Возможно использование директив совместно с выражениями, метками команд и идентификаторами ячеек памяти. В последних двух случаях в процессе трансляции формируется смещение метки или идентификатора относительно начала того сегмента, в котором они определены. Для определения констант применяется знак равенства и директива EQU (Equal). В первом случае значения констант можно изменять. Знак равенства может использоваться только для определения констант и константных выражений арифметического типа. Директива EQU может использоваться для определения константных выражений любого типа. $ - значение счетчика текущего адреса. Запись AL в четвертой команде означает, что данные размещены в регистре AL, запись [DI] означает, что данные расположены в ячейке памяти, относительный адрес которой находится в DI. Если бы последние две команды имели вид mov Mem, 26 и mov Ibx + di + 1], 26h, было бы неясно, какую разрядность имеют пересылаемые данные, поэтому при пересылке байта мы записываем команду с указателем BYTE PTR (pointed by), a при пересылке слова - с указателем WORD PTR. Глава LES 1-й операнд, 2-й операнд Загрузка указателя с использованием ES {команда считывает из ячейки памяти, указанной в качестве второго операнда, двойное во (32 разряда), являющееся указателем (полным адресом ячейки памяти), и загружает ШУЮ половину указателя, т. е. относительный адрес, в регистр, указанный в качестве первого операнда, а старшую половину указателя, т. е. сегментный адрес, в ES. LDS 1-й операнд, 2-0 операнд Загрузка указателя с использованием DS Команда считывает из ячейки памяти, указанной в качестве второго операнда, двойное слово (32 разряда), являющееся указателем (полным адресом ячейки памяти), и загружает младшую половину указателя, т. е. относительный адрес, в регистр, указанный в качестве первого операнда, а старшую половину указателя, т. е. сегментный адрес, в DS. LAHF Загрузка младшей половины регистра флагов в АН (Load АН with flags) Команда копирует флаги SF, ZF, AF, PF и CF соответственно в разряды 7, 6, 4, 2 и О АН. Значение других битов не определено. SAHF Запись содержимого АН в младшую половину регистра флагов (Store АН into flags) Команда зафужает флаги SF, ZF, AF, PF и CF значениями, установленными соответственно в разрядах 7, 6, 4, 2 и О АН. Арифметические команды (двоичная арифметика) - ADD, ADC, CBW, CMP, CWD, DEC, DIV, IDIV, IMUL, INC, MUL, NEC, SBB, SUB. l-u операнд, 2-й опернд Сложение (Add) ное°" """"" арифметическое сложение первого и второго операндов, исход-Можн°*™° первого операнда заменяется суммой. В качестве первого операнда """"ьзовать регистр (кроме сегментного) или ячейку памяти, в качестве второго не д ("Роме сегментного), ячейку памяти или непосредственное значение, при этом У «ается оба операнда одновременно определять как ячейки памяти. ADC 1-й операнд, 2-fl операнд Сложение с переносом (Add with carry) Команда выполняет арифметическое сложение первого и второго операндов, прибавля-ет к результату значение флага CF и заменяет исходное содержимое первого операнда полученной суммой. В качестве первого операнда можно использовать регистр (кроме сегментного) или ячейку памяти, в качестве второго - регистр (кроме сегментного), ячейк\ памяти или непосредственное значение, при этом не допускается оба операнда одновременно определять как ячейки памяти. Используется для сложения 32-разрядных чисел. INC операнд Инкремент (увеличение на 1) (Increment) Команда прибавляет 1 к операнду, в качестве которого можно использовать регистр (кроме сегментного) или ячейку памяти. Флаг CF при выполнении этой команды не затрагивается. SUB 1-й операнд, 2-й операнд Вычитание (Subtract) Команда вычитает второй операнд из первого, исходное содержимое первого операнда заменяется разностью. В качестве первого операнда можно использовать регистр (кроме сегментного) или ячейку памяти, в качестве второго - регистр (кроме сегментного), ячейку памяти или непосредственное значение, при этом не допускается оба операнда одновременно определять как ячейки памяти. SBB 1-й операнд, 2-й операнд Вычитание с заемом (Subtract with borrow) Команда вьиитает второй операнд из первого, из полученной разности вычитается значение флага CF, исходное содержимое первого операнда заменяется полученным результатом. В качестве первого операнда можно использовать регистр (кроме сегментного) или ячейку памяти, в качестве второго - регистр (кроме сегментного), ячейку памяти или непосредственное значение, при этом не допускается оба операнда одновременно определять как ячейки памяти. СМР 1-й операнд, 2-й операнд Сравнение (Compare) Команда вычитает второй операнд из первого, при этом в соответствии с результато»* устанавливаются флаги. Сами операнды не изменяются. В качестве первого onepaiW можно использовать регистр (кроме сегментного) или ячейку памяти, в качестве второг - регистр (кроме сегментного), ячейку памяти или непосредственное значение, при эт не допускается оба операнда одновременно определять как ячейки памяти. Обыч после команды сравнения в профамме стоит команда условного перехода. DEC операнд Декремент (уменьшение на 1) (Decrement) Команда вычитает 1 из операнда, в качестве которого можно использовать регистр (кроме gPeHTHoro) или ячейку памяти. Флаг CF при выполнении этой команды не затрагивается. MUL операнд Умножение целых беззнаковых чисел (Unsigned multiply) Команда умножает число, находящееся в AL (в случае умножения на байт) или АХ (в случае умножения на слово), на операнд. В качестве операнда можно использовать рои или ячейку памяти. Размер произведения в два раза больше размера сомножителей. При размере сомножителей, равном байту, произведение записывается в АХ, при размере сомножителей, равном слову, произведение записывается в DX: АХ. IMUL операнд Умножение целых знаковых чисел (Signed integer multiply) Команда умножает число, находящееся в AL (в случае умножения на байт) или АХ (в случае умножения на слово), на операнд. В качестве операнда можно использовать РОН или ячейку памяти. Размер произведения в два раза больше размера сомножителей. При размере сомножителей, равном байту, произведение записывается в АХ, при размере сомножителей, равном слову, произведение записывается в DX: АХ. DIV операнд Деление целых беззнаковых чисел (Unsigned divide) Команда делит число, находящееся в АХ (в случае деления на байт) или DX: АХ (в случае деления на слово), на операнд. В качестве операнда можно использовать РОН или ячейку памяти. Размер делимого в два раза больше размеров делителя, частного и остатка. При размере операнда, равном байту, частное записывается в AL, а остаток - Н, при размере операнда, равном слову, частное записывается в АХ, а остаток - в DX. операнд Деление целых знаковых чисел (Signed integer divide) манда делит число, находящееся в АХ (в случае деления на байт) или DX: АХ (в слу-ччейку слово), на операнд. В качестве операнда можно использовать РОН или Г1ри раз"™ Размер делимого в два раза больше размеров делителя, частного и остатка. "Ри Разм Умножителей, равном байту, частное записывается в AL, а остаток - в АН, ре сомножителей, равном слову, частное записывается в АХ, а остаток - в DX. Преобразование байта в слово (Convert byte to worjj Команда заполняет АН знаковым битом числа, находящегося в AL, преобразуя таких, образом 8-разрядное число со знаком в 16-разрядное. Преобразованне слова в двойное слово (Convert word to double word) Команда заполняет DX знаковым битом числа, находящегося в АХ, преобразуя таким образом 16-разрядное число со знаком в 32-разрядное. NEG операнд Изменение знака (дополнение до 2) (Change sign) Команда вычитает из нуля знаковое целочисленное значение операнда, превращая положительное число в отрицательное и наоборот. В качестве операнда можно использовать регистр (кроме сегментного) или ячейку памяти. Примеры Данные DB NLow DW NHigh DW ;==== Команды ==== 0123456789 ; Массив Mas содержит ASCII-коды цифр, ; Mas[0] = 30h, Mas[l] = 31h, ... , ; Mas[9] = 39h ; Младшая часть 32-разрядного числа N ; Старшая часть 32-разрядного числа N Offffh 2209h mov mov add adc mov dec neg lea mov mul mov dec mov mov div ax, dx, ax, dx, si, si si bx, al, 0002h 0005h NLow NHigh NLow ; Младшая часть числа М ; Старшая часть числа М Сложение младших частей, CF = 1 ; Сложение старших частей, ; в DX: АХ сумма N + М SI = 65535 ; SI = 65534 = OFFFEh ; SI = 2 Mas + 5 BYTE PTR [bx dx, si dx ax, bx, bx + si] AL AX 26h lOOh ; Старшая часть делимого, DX = 1 Младшая часть делимого, АХ = 26h Делитель, ВХ = 256 ; АХ = 256 (частное), DX = 38 (остаток) Примечание. При записи шестнадцатеричных чисел, начинающихся с А, В, С, D, Е или F, справа приписывается О, чтобы нельзя было спутать это число с именем ячейки памяти или каким-либо другим идентификатором. Глава Апифметические команды (десятичная арифметика) -AAD, ААМ, AAS, DAA, DAS AAA........................................................................................................................ .............. ASCII-коррекцня АХ после сложения (ASCII adjust for add) Выполнение команды AAA обычно имеет смысл после выполнения команды ADD, которая оставляет байт результата в AL. Команда AAA корректирует сумму двух неупакованных двоично-десятичных чисел, полученную в AL. В результате коррекции в АХ Аоомируется результат - неупакованное двоично-десятичное число. Если сложение привело к возникновению десятичного переноса, содержимое АН увеличивается и флаги CF и AF устанавливаются в 1. ASCII-коррекция АХ после вычитания (ASCII adjust for subtract) Выполнение команды AAS обычно имеет смысл после выполнения команд SUB и SBB, которые оставляют байт результата в AL. Команда AAS корректирует разность двух неупакованных двоично-десятичных чисел, полученную в AL. В результате коррекции в АХ формируется результат - неупакованное двоично-десятичное число. Если вычитание привело к возникновению десятичного заема, содержимое АН уменьшается и флаги CF и AF устанавливаются в 1. ASCII-коррекция АХ после умножения (ASCII adjust for multiply) Команда используется для коррекции результата умножения двух неупакованных двоично-десятичных чисел. Команда делит содержимое AL на 10 и загружает частное в АН, а остаток - в AL. ASCII-коррекция АХ перед делением (ASCII adjust for divide] Команда используется для коррекции неупакованного двоично-десятичного числг поел " ™ делением на другое неупакованное двоично-десятичное число, так чтобь чш был получен корректный результат. Это выполняется следующим обра m:AL=al + (AH*10), АН = 0. 0 [ 1 ] 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |