Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ВМСиС.docx
Скачиваний:
23
Добавлен:
22.04.2019
Размер:
278.98 Кб
Скачать

16.Процессор х86: инструкции ввода-вывода.

"in" переводит байт, слово или двойное слово из порта ввода в AL, AX или EAX. Порты ввода-вывода могут быть адресованы либо напрямую, непосредственно с помощью байтового значения, либо непрямо через регистр DX. Операндом-адресатом должен быть регистр AL, AX или EAX. Операндом-источником должно быть число от 0 до 255 либо регистр DX.

in al,20h ; ввод байта из порта 20

in ax,dx ; ввод слова из порта, адресованного регистром DX

"out" переводит байт, слово или двойное слово из порта вывода в AL, AX или EAX. Программа может может определить номер порта, используя те же методы, что и в инструкции "in". Операндом-адресатом должен быть регистр AL, AX или EAX. Операндом-источником должно быть число от 0 до 255 либо регистр DX.

out 20h,ax ; вывод байта в порт 20

out dx,al ; вывод слова в порт, адресованный регистром DX

17.Представление целых чисел: прямой код, дополнительный код, bsd.

Процессор выполняет операции сложения, вычитания, умножения и деления с целыми числами, представленными в дополнительном коде. Дополнительный код означает, что для представления отрицательных чисел используется не их модуль, а дополнение этого модуля до числа с одной единицей за пределами разрядной сетки.

Для байта используется дополнение до 100h, для слова – 10000h, для двойного слова – 100000000h.

Помимо дополнительного кода для представления отрицательных чисел существует прямой код. В этом случае один из битов, обычно старший, отводится под знак числа, а остальные биты – под его модуль. Однако данный формат представления целых чисел не получил широкого распространения, так как в этом формате требуется различная аппаратная реализация для операций сложения и вычитания для знаковых и беззнаковых чисел.

Беззнаковые числа могут быть только положительными и под модуль числа отводятся все биты. Байт без знака может принимать значения от 0 до FFh(255), слово без знака – от 0 до FFFFh (65535), двойное слово без знака – от 0 до FFFFFFFFh(4294967295).

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

Например байт 0xE7 в беззнаковом представлении соответствует числу 231, а в знаковом – числу –25 (256-231=25).

Если этот байт сложить с байтом 0x0C(12), то получится 0xF3.

0xF3 без знака означает число 243, а со знаком – число –13.

Т.е. операция сложения, аппаратно реализованная для беззнаковых чисел, дает правильный результат и для знаковых чисел в дополнительном коде. Именно по этой причине большинство процессоров использует дополнительный, а не прямой код.

Байт со знаком для положительных чисел предоставляет диапазон от 0 до 0x7F (127), а для отрицательных – от 0x80(-128) до 0xFF (-1).

Слово со знаком для положительных чисел предоставляет диапазон от 0 до 0x7FFF (32767), а для отрицательных – от 0x8000(-32768) до 0xFFFF (-1).

Двойное слово со знаком для положительных чисел предоставляет диапазон от 0 до 0x7FFFFFFF (2147483647), а для отрицательных – от 0x80000000(-2147483648) до 0xFFFFFFFF (-1).

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

Например:

int a,b;

unsigned int c,d;

short s,t;

unsigned short u,w;

char m,n;

unsigned char p,q;

asm{

mov al, p

mov ah, 0 // в регистре ax находится слово, равное по величине p

mov ax, w

mov dx, 0 // регистровая пара dx:ax содержит двойное слово, равное w

and eax, 0x0000FFFF // регистр eax содержит двойное слово, равное w

}

Если же числа знаковые, то для положительных чисел производится заполнение старшей половины нулями, а для отрицательных – единицами. Поскольку эта операция встречается довольно часто, то она реализована аппаратно. При этом старший бит операнда источника (младшая половина) копируется во все разряды операнда приемника (старшая половина). Эта операция называется расширением знакового бита и всегда производится только в регистрах данных A и D, поэтому операнды в данной инструкции не требуются:

Источник

Приемник

Мнемокод

Комментарий

AL

AX

CBW

Байт – Слово

AX

DX:AX

CWD

Слово – Двойное слово

AX

EAX

CWDE

Слово – Двойное слово

EAX

EDX:EAX

CDQ

Двойное слово – Учетверенное слово

Расширение разрядности можно совместить с копированием данных. При этом разрядность приемника всегда больше разрядности источника. Для такого копирования используются специальные инструкции movsx (sx – Sign eXtention: расширение знаковым битом) и movzx (zx – Zero eXtention: расширение нулем).

Например:

int a,b;

unsigned int c,d;

short s,t;

unsigned short u,w;

asm{

movsx s, al

movzx u, bh

movsx a, ax

movzx c, dx

movsx eax, t

movzx ebx, d

mov ax, t

cwd

mov eax, b

cdq

}

И, наконец, инструкция neg изменяет знак своего единственного операнда на противоположный. Операндом может быть как регистр, так и объект в памяти.