Иллюстрированный самоучитель по Assembler

C

Пример 1:

; В полях данных
mem dq 1122334455667788h
;В программном сегменте
mov ЕСХ,9
mov ЕВХ,5
mov EDX,11223344h
mov EAX,55667788h
cmpxchgSb mem; mem=EDX:EAX. ECX:EBX ® mem;
mem=0000000900000005h

Пример 2:

; В полях данных
mem dq 1122334455667788h
;B программном сегменте
mov ECX,9
mov EBX,5
mov EDX,11223344h
mov EAX,55667789h
cmpxchgSb mem
;memOEDX: EAX. Mem – " EDX: EAX
;mem=1122334455667788h
;EDX=11223344h, EAX=55667788h

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

Пример 3:

; В полях данных
mem1 db '12345678'; Строка-операнд
mem2 db '12345678'; Сравниваемая строка
;В программном сегменте
mov ECX,68676665h; 'efgh'
mov EBX,64636261h; 'abcd'
mov EDX,dword ptr mem2+4; Забираем старшую часть строки
mov EAX,dword ptr mem2; Забираем младшую часть строки
cmpxchg8b gword ptr mem1; Операнды совпадают
;ZF=1, mem1=''abcdefgh''
;ECX:EBX без изменений
;EDX:EAX без изменений

Пример 4:

;В полях данных
mem1 db '12345678'; Строка-операнд
mem2 db 'abcdefgh'; Сравниваемая строка
; В программном сегменте
mov ECX,68676665h; 'efgh'
mov EBX,64636261h; 'abed'
mov EDX,dword ptr mem2+4; 3абираем старшую часть строки
mov EAX,dword ptr mem2; Забираем младшую часть строки
cmpxchg8b qword ptm mem1; Операнды не совпадают
;ZF=0, EDX=38373635='5678'
;EAX=34333231='1234'
;mem1s без изменения
;При неравенстве ЕСХ:ЕВХ не принимают участие в операции
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.