[ Асм №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