Регистры данных (Таблица № 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).
mov ax,1234h | AX = 1234h, AH = 12h, AL = 34h |
mov bx,5678h | BX = 5678h, BH = 56h, BL = 78h |
mov cx,9ABCh | CX = 9ABCh, CH = 9Ah, CL = 0BCh |
mov dx,0DEF0h | DX = 0DEF0h, DH = 0DEh, DL = 0F0h |
Рассмотрим еще два оператора: ADD и SUB. Оператор ADD имеет следующий формат (в последствии мы всегда будем оформлять новые команды в такие таблицы):
ADD приемник, источник | ADDition - сложение | Сложение | 8086 |
Команда 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 |
Примеры:
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 миллионов (!) раз! А еще называют «четверку» медленной!..