Ассемблер Это просто! Учимся программировать

       

Регистры данных (Таблица № 1)


Могут использоваться программистом по своему усмотрению (за исключением некоторых случаев). В них можно хранить любые данные (числа, адреса и пр.). В верхнем ряду

AX (Accumulator register - аккумулятор). Применяется для хранения промежуточных данных. В некоторых командах использование этого регистра обязательно

BX (Base register - база). Применяется для хранения базового адреса некоторого объекта в памяти

CX (Count register - счетчик). Применяется в командах, производящих некоторые повторяющиеся действия.

DX (Data register - регистр данных). Так же, как и регистр AX, он хранит промежуточные данные. В некоторых командах его использование обязательно; для некоторых команд это происходит неявно

Эти шестнадцатиразрядные регистры могут хранить числа от 0 до 65.535 (от 0h до FFFFh в шестнадцатеричной системе (вспоминаем прошлую главу)). Под ними идет ряд восьмиразрядных регистров (AH, AL, BH, BL, CH, CL, DH, DL), которые могут хранить максимальное число 255 (FFh). Это половинки (старшая или младшая) шестнадцатиразрядных регистров.

Например:

Мы уже знаем оператор MOV, который предназначен для загрузки числа в регистр. Чтобы присвоить, к примеру, регистру AL число 35h, нам необходимо записать так:

mov al,35h

а регистру AX число 346Ah - так:

mov ax,346Ah

Если мы попытаемся загрузить большее число, чем может содержать регистр, то, при ассемблировании программы произойдет ошибка.

Например, следующие записи будут ошибочны:

mov ah,123h максимум FFh mov bx,12345h максимум FFFFh mov dl,100h максимум FFh

Здесь надо отметить, что если шестнадцатеричное число начинается не с цифры (напр.: 12h), а с буквы (A-F) (напр.: С5h), то перед таким числом ставится нуль: 0C5h. Это необходимо для того, чтобы программа-ассемблер могла отличить где шестнадцатеричное число, а где метка. Ниже мы рассмотрим это на примере.

Допустим, мы выполнили команду mov ax,1234h. В этом случае в регистре AH будет находится число 12h, а в регистре AL - 34h. Т.е. AL, BL, CL, DL - это младшие (Low), а AH, BH, CH, DH - старшие (High) половинки шестнадцатиразрядных регистров (см. Таблицу № 4).

Таблица № 4. Результаты выполнения различных команд



КомандаРезультат

mov ax,1234hAX = 1234h, AH = 12h, AL = 34h
mov bx,5678hBX = 5678h, BH = 56h, BL = 78h
mov cx,9ABChCX = 9ABCh, CH = 9Ah, CL = 0BCh
mov dx,0DEF0hDX = 0DEF0h, DH = 0DEh, DL = 0F0h
<
Рассмотрим еще два оператора: ADD и SUB. Оператор ADD имеет следующий формат (в последствии мы всегда будем оформлять новые команды в такие таблицы):

КомандаПереводНазначениеПроцессор
ADD приемник, источникADDition - сложениеСложение8086
В столбце Команда будет описываться новая команда и ее применение. В столбце Назначение - что выполняет или для чего служит данная команда, а в столбце Процессор - модель (тип) процессора с которого она поддерживается. Перевод - с какого английского слова образован оператор и его перевод. В данном примере - это 8086 процессор, но работать команда будет, естественно и на последующих, более современных процессорах (80286, 80386 и т.д.).

Команда ADD производит сложение двух чисел.

Примеры:

mov al,10 ; загружаем в регистр AL число 10 add al,15 ; AL = 25; AL - приемник, 15 - источник

mov ax,25000 ; загружаем в регистр AX число 25000 add ax,10000 ; AX = 35000; AX - приемник, 10000 - источник

mov cx,200 ; загружаем в регистр CX число 200 mov bx,760 ; а в регистр BX - 760 add cx,bx ; CX = 960, BX = 760 (BX не меняется), CX - приемник, BX - источник

КомандаПереводНазначениеПроцессор
SUB приемник, источникSUBtraction - вычитаниеВычитание8086
Команда SUB производит вычитание двух чисел

Примеры:

mov al,10 sub al,7 ; AL = 3, AL - приемник, 7 - источник

mov ax,25000 sub ax,10000 ; AX = 15000, AX - приемник, 10000 - источник

mov cx,100 mov bx,15 sub cx,bx ; CX = 85, BX = 15 (BX не меняется!), CX - приемник, BX - источник

Это интересно

Следует отметить, что Ассемблер максимально быстрый язык. Можно посчитать сколько раз за одну секунду процессор сможет сложить два любых числа от 0 до 65535.

Каждая команда процессора выполняется определенное количество тактов. Когда говорят, что тактовая частота процессора 100Mhz, то это значит, что за секунду проходит 100 миллионов тактов.

Чтобы сложить два числа в Ассемблере нужно выполнить следующие команды:

mov ax,2700

mov bx,15000

add ax,bx

В результате выполнения данных инструкций, в регистре AX будет число 17700, а в регистре BX - 15000. Команда add ax,bx выполняется за один такт на процессоре 80486. Получается, что компьютер 486 DX2-66Mhz за одну секунду сложит два любых числа (от 0 до 0FFFFh) 66 миллионов (!) раз! А еще называют «четверку» медленной!..


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