[ Асм №1 ]
Привет тебе кодер, спорю что ты когда нить пробовал программировать,
на ассемблере или хотя бы слышал об этом, я решил сделать серию
статей о C++ и Ассемблере, в этой статье я опишу достаточно много
функций с примерами и командами ассембера, и так погнали знакомиться
с командами "передачи данных" а именно
"MOV, LAHF, LDS, LEA, LES, SAHF, XCHG, XLAT".
MOV 1-й Операнд, 2-й Операнд:
Команда замещает первый операнд вторым. Исходное значение первого
операнда теряется. В качестве второго операнда могут использоваться
непосредственный операнд(число), регистр или операнд находящийся в
памяти или проще говоря переменная. В качестве первого операнда(регистр),
только не (регистр CS) или яче ка памяти. Оба операнда должны иметь
одинаковую разрядность. Нельзя выполнять пересылку из ячейку памяти
в ячейку памяти, а также загрузку сегментного регистра
непосредственным значением.
LAHF Загрузка младшей половины регистра флагов в AH:
Команда копирует флаги SF, ZF, AF, PF и CF соотвественно в
разряды 7,6,4,2 и 0 AH. Значение других регистров не определено.
LDS 1-й Операнд, 2-й Операнд, загрузка указателя с использованием DS:
Данная команда считывает из ячейки памяти, указанной в качестве
второго операнда, двойное слово(32 разряда), являющееся указателем
(полным адрессом ячейки памяти), и загружает младшую половину
указателя, т.е. относительный адрес, в регистр, указанный в качестве
первого операнда, а старшую половину указателя, т.е. сегментный
адрес в DS.
LEA 1-й Операнд, 2-й Операнд Загрузка относительного адреса:
Команда LEA заргужает в регистр кроме сегментного, указанный в
качестве первого операнда, относительный адресс ячейки памяти, указанный
в качестве второго операнда.
LES 1-й Операнд, 2-й Операнд Загрузка указателя с использованием ES:
Данная команда считывает из ячейки памяти, указанной в качестве
второго операнда, двойное слово(32 разряда), являющееся указателем
(полным адрессом ячейки памяти), и загружает младшую половину
указателя, т.е. относительный адрес, в регистр, указанный в качестве
первого операнда, а старшую половину указателя, т.е. сегментный
адрес в ES.
SAHF Запись содержимого AH в младшую половину регистра флагов:
Команда загружает флаги SF, ZF, AF, PF и CF значениями,
установленными соответственно в разрядах 7,6,4,2 и 0 AH.
XCHG 1-й Операнд, 2-й Операнд Обмен данными между операндами:
Команда меняет местами содержимое двух операндов. В качестве
операндов можно указывать регистр (кроме сегментого) или ячейку
памяти, при этом не допускается оба операнда одновременно определять,
как ячейки памяти.
XLAT Табличная трансляция:
Команда заменяет содержимое AL байтом из таблицы (максимальный размер
таблицы - 256 байтов), начальный адрес которой равен DS:BX.
Содержимое AL рассматривается как смещение в таблице, из соответствующей
ячейки таблицы извлекается байт и помещается в AL.
И так мы познакомились с командами передачи данных и так переходим к
примерами.
Любая программа начинатся с описанием данных, что мы сейчас и делаем:
Mas DB 26, 77, (22 - 5)/2, 19, 0 ;Массив байтов
MSize EQU $ - Mas ;Размер массива Mas, МSize = 5
Mem DW 3502h ;16-разрядная ячейка памяти
Buf DB 10 DUP (?) ;Буфер объемом 10 байт, содержимое буфера не определено
Var = 2 ;Var = 2 ;)
Теперь приступаеи к написанию кода и используем все выше написанные
команды передачи данных:
mov ax, MasSize ;Содержимое AX будет равно 5, AX = 5
xchg ax, Mem ;AX и ячейка обмениваются содержимы, то есть AX = 3502h а Mem = 5
mov di, OFFSET Buf ;Запись в SI относительного адресса буфера Buf
mov [di],al ;Пересылка байта из AL в 8 разрядную яс=чейку памяти с адресом DS: DI, Buf[0] = 2bx
mov di, 3 ;Запись в di десятичного числа 3, di = 3
mov bx, di ;Пересылка слова из di в bx, bx = 3
mov dl, Mas[bx] ;Пересылка в dl элемента массива Mas, индекс которого находится в BX, dl = 19
lea bz, Mas ;Запись в BX относительного адреса массива Mas
mov ah, [bx + di] ;Запись в AH содержимого ячейки памяти относительный адрес который равен сумме седержимого BX и DI, AH = Mas[3] = 19
mov WORD PTR Mem, 26 ;Запись в ячейку Mas[4] шестнадцатиричного числа 26h
var = 3
mov al, Var ;AL = 3
xlat ;Чтение содержимого массива ячейки Mas[3], al = 19
Ну вот думаю все понятно как рабоать с данными функциями, в следующей
статье мы продолжим изучать данные функции, конечно сам когда писал
статью подсматривал в учебник, все же я не могу запомнить :),
ну вот и все пакеда с вами был Outlaw
(с) Outlaw