Сейчас на форуме: bartolomeo, -Sanchez- (+3 невидимых) |
eXeL@B —› Вопросы новичков —› Справочник по командам ассемблера |
<< . 1 . 2 . |
Посл.ответ | Сообщение |
|
Создано: 13 февраля 2006 23:42 · Личное сообщение · #1 Начал писать проги на асме буквально 2-3 дня назад и вот у меня возник такая проблема. Нужен справочник по командам асма. Не учебник, а именно справочник(с програмированием проблем не возникало, но чувствую, что команд я заню маловато). Перечень команд, что команда делает, какие регистры и флаги меняет и т.д. и .т.п. Но желательно, чтобы всё это было описано в минимальном, но достаточном для понимания объёме. Кто чё посоветует? |
|
Создано: 26 февраля 2006 00:59 · Личное сообщение · #2 RCR Циклический сдвиг вправо через бит переноса Команда rсl осуществляет сдвиг вправо всех битов операнда. Если команда записана в формате rcl операнд,1 сдвиг осуществляется на 1 бит. В старший бит операнда заносится значение флага CF; младший бит операнда загружается в CF. Если команда записана в формате rcl операнд,CL сдвиг осуществляется на число бит, указанное в регистре-счетчике CL, при этом в процессе последовательных сдвигов младшие биты операнда поступают сначала в CF, а оттуда - в старшие биты операнда (Рис. П5). Рис. П.5. Действие команды rcl. В качестве операнда можно указывать любой регистр (кроме сегментного) или ячейку памяти размером как в байт, так и в слово. Не допускается использовать в качестве операнда непосредственное значение. Команда воздействует на флаги OF и CF. Пример 1 clc ;Сбросим флаг CF mov AX, 2 rcr АХ,1 ;АХ=1, CF=0 Пример 2 stc ;Установим флаг CF mov DL,8 rcr DL,1 ;DL=84h, CF=0 Пример 3 clc ;Сбросим флаг CF mov BX,OFh rcr BX,1 ;BX=7, CF=1 Пример 4 clc ;Сбросим флаг CF mov DH,80h mov CL,5 ;Счетчик сдвигов rcr DH,CL ;DH=4, CF=0 Допустим сдвиг 32-битовых операндов. Допустимо указание числа бит сдвига как с помощью регистра CL, так и непосредственным значением. Максимальная величина сдвига составляет 31 бит. Пример mov ESI,0FFFF000lh clc ;Сбросим флаг CF rcr ESI,8 ;ESI=02FFFF00h, CF=0 Pentium+P RDMSR Чтение особого регистра модели Команда читает содержимое внутреннего регистра, специфического для конкретной модели процессора. REP Повторение REPE Повторение пока равно REPZ Повторение пока нуль REPNE Повторение пока равно REPNZ Повторение пока не равно Префиксы повторения, позволяющие организовывать циклическое выполнение команд обработки строк cmps, movs и seas, и при этом проверять наличие указанного в префиксе условия. Префикс rep, будучи установлен перед строковой командой movs или stos, заставляет ее выполняться СХ раз. Префикс rере (и полностью эквивалентный ему префикс repz), будучи установлен перед строковой командой cmps или seas, заставляет ее выполняться до тех пор, пока результат выполнения равен 0 и, соответственно, ZF=1, но не более СХ раз. Префикс rерnе (и полностью эквивалентный ему префикс repnz), будучи установлен перед строковой командой cmps или seas, заставляет ее выполняться до тех пор, пока результат выполнения не равен 0 и, соответственно, ZF=0, но не более СХ раз. Примеры использования префиксов повторения см. в описаниях строковых команд cmps, movs и seas. RET Возврат из процедуры RETN Возврат из ближней процедуры RETF Возврат из дальней процедуры Команда ret извлекает из стека адрес возврата и передает управление назад в программу, первоначально вызвавшую процедуру. Если командой ret завершается ближняя процедура, объявленная с атрибутом near, или используется модификация команды retn, со стека снимается одно слово- относительный адрес точки возврата. Передача управления в этом случае осуществляется в пределах одного программного сегмента. Если командой ret завершается дальняя процедура, объявленная с атрибутом far, или используется модификация команды retf, со стека снимаются два слова: смещение и сегментный адрес точки возврата. В этом случае передача управления может быть межсегментной. В команду ret может быть включен необязательный операнд (кратный 2), который указывает, на сколько байтов дополнительно смещается указатель стека после возврата в вызывающую программу. Прибавляя эту константу к новому значению SP, команда ret обходит аргументы, помещенные в стек вызывающей программой (для передачи процедуре) перед выполнением команды call. Обе разновидности команды не воздействуют на флаги процессора. Пример 1 … call subr ;Вызов подпрограммы subr proc near . . . ;Тело процедуры-подпрограммы ret subr endp Пример 2 push AX ;Параметр 1, передаваемый в ;подпрограмму push SI ;Параметр 2, передаваемый в ;подпрограмму call subr ;Вызов подпрограммы … subr proc near … ;Извлечение из стека параметров ; (без изменения содержимого SP) ret 4 ;Возврат в вызывающую ;программу и снятие со стека ;двух слов с параметрами subr endp ROL Циклический сдвиг влево Команда rol осуществляет сдвиг влево всех битов операнда. Если команда записана в формате rol операнд,1 сдвиг осуществляется на 1 бит. Старший бит операнда загружается в его младший разряд и одновременно заносится в флаг CF (рис. П6). Если команда записана в формате rol операнд,CL сдвиг осуществляется на число бит, указанное в регистре-счетчике CL, при этом в процессе последовательных сдвигов старшие биты операнда перемещаются в его младшие разряды. Последний перенесенный бит одновременно заносится в флаг CF. Рис. П6. Действие команды rol. В качестве операнда можно указывать любой регистр (кроме сегментного) или ячейку памяти размером как в байт, так и в слово. Не допускается использовать в качестве операнда непосредственное значение. Команда воздействует на флаги OF и CF. Пример 1 mov AX,1 rol AX,1 ;AX=0002h, CF=0 Пример 2 mov DL,8 Oh rol DL,1 ;DL=01h, CF=1 Пример 3 mov DX,3000h mov CL,4 rol DX,CL ;DX=0003h, CF=1 Пример 4 mov DX,2000h mov CL,4 rol DX,CL ;DX=0002h, CF=0 Допустим сдвиг 32-битовых операндов. Допустимо указание числа бит сдвига как с помощью регистра CL, так и непосредственным значением. Максимальная величина сдвига составляет 31 бит. Пример mov ЕАХ,012345678h rol EАХ,16 ;EAX=56781234h >ROR Циклический сдвиг вправо Команда ROR осуществляет циклический сдвиг вправо всех битов операнда. Если команда записана в формате ror операнд,1 сдвиг осуществляется на 1 бит. Младший бит операнда записывается в его старший разряд и одновременно поступает в флаг CF (рис.Ш). Если команда записана в формате ror операнд,CL сдвиг осуществляется на число бит, указанное в регистре-счетчике CL, при этом в процессе последовательных сдвигов младшие биты операнда перемещаются в его старшие разряды. Последний перенесенный бит одновременно заносится в флаг CF. Рис. П7. Действие команды ror. В качестве операнда можно указывать любой регистр (кроме сегментного) или ячейку памяти размером как в байт, так и в слово. Не допускается использовать в качестве операнда непосредственное значение. Команда воздействует на флаги OF и CF. Пример 1 mov AX,2 ror AX,1 ;AX=0001h, CF=0 Пример 2 mov DL,81h ror DL,1 ;DL=C0h, CF=1 Пример 3 mov BX,000Eh mov CL,4 ror BX,CL ;BX=E000h, CF=1 Пример 4 mov BX,0009h mov CL,4 ror BX,CL ;BX=9000h, CF=1 Допустим сдвиг 32-битовых операндов. Допустимо указание числа бит сдвига как с помощью регистра CL, так и непосредственным значением. Максимальная величина сдвига составляет 31 бит. Пример mov EDI,90000001h ror EDI,12 ;EDI=00190000h SAHF Запись содержимого регистра АН в регистр флагов Команда sahf копирует разряды 7, 6, 4, 2 и 0 регистра АН в регистр флагов процессора, устанавливая тем самым значения флагов SF, ZF, AF, PF и CF соответственно. Команда не имеет операндов. Команда sahf (совместно с командой lahf) дает возможность читать и изменять значения флагов процессора, в том числе флагов SF, ZF, AF и PF, которые нельзя изменить непосредственно. Однако следует иметь в виду, что команда sahf заполняет только младший байт регистра флагов. Поэтому нельзя изменить с ее помощью, например, состояние флага OF. Пример 1 lahf ;Регистр АН отображает ;состояние регистра флагов or АН,80h ;Установка бита 7 = SF sahf ;Загрузка АН в регистр ;флагов, где теперь будет SF = 1 Пример 2 lahf ;Регистр АН отображает ;состояние регистра флагов and АН,0BFh ;Сброс бита 6 = ZF sahf ;Загрузка АН в регистр ;флагов, где теперь будет ZF = 0 Пример 3 mov АН, 5 sahf ;Устанавливаются флаги PF и ;CF и сбрасывается флаги SF, ;ZF и AF SAL Арифметический сдвиг влево Команда sal осуществляет сдвиг влево всех битов операнда. Старший бит операнда поступает в флаг CF. Если команда записана в формате sal операнд, 1 сдвиг осуществляется на 1 бит. В младший бит операнда загружается 0. Если команда записана в формате sal операнд,CL сдвиг осуществляется на число битов, указанное в регистре-счетчике CL, при этом в процессе последовательных сдвигов старшие биты операнда, пройдя через флаг CF, теряются, а младшие заполняются нулями (рис. П8.). Рис. П8. Действие команды sal. В качестве операнда команды sal можно указывать любой регистр (кроме сегментного) или ячейку памяти размером как в байт, так и в слово. Не допускается использовать в качестве операнда непосредственное значение. Каждый сдвиг влево эквивалентен умножению знакового числа на 2, поэтому команду sal удобно использовать для возведения операнда в степень 2. Команда воздействует на флаги OF, SF, ZF, PF и CF. Пример 1 mov AL,7 sal AL,1 ;AL= 0Eh=7*2, CF=0 Пример 2 mov AX,IFh mov CL,8 sal AX,CL ;AX=lF00h=lFFh*256, CF=0 Пример 3 mov SI,-1 ;SI=FFFFh mov CL,4 sal SI,CL ;SI=FFF0h=-l*16=-16, CF=1 Допустим сдвиг 32-битовых операндов. Допустимо указание числа бит сдвига как с помощью регистра CL, так и непосредственным значением. Максимальная величина сдвига составляет 31 бит. Пример mov EBX,0000C835h sal EBX,5 ;EBX=001906A0h SAR Арифметический сдвиг вправо Команда sar осуществляет сдвиг вправо всех битов операнда. Младший бит операнда поступает в флаг CF. Если команда записана в формате sar операнд,1 сдвиг осуществляется на 1 бит. Старший бит операнда сохраняет свое значение. Если команда записана в формате sar операнд,CL сдвиг осуществляется на число бит, указанное в регистре-счетчике CL, при этом в процессе последовательных сдвигов младшие биты операнда, пройдя через флаг CF, теряются, а старший бит расширяется вправо (рис. П9). Рис. П.9. Действие команды sar. В качестве операнда можно указывать любой регистр (кроме сегментного) или ячейку памяти размером как в байт, так и в слово. Не допускается использовать в качестве операнда непосредственное значение. Каждый сдвиг вправо эквивалентен делению знакового числа на 2, поэтому команду sar удобно исп |
|
Создано: 26 февраля 2006 01:01 · Личное сообщение · #3 поэтому команду sar удобно использовать для деления операнда на целые степени 2. Команда воздействует на флаги OF, SF, ZF, AF, PF и CF. Пример 1 mov AL,7 sar AL,1 ;AL=3=7/2, CF=1. Остаток ;потерян Пример 2 mov AX,lFF0h mov CL,4 sar AX,CL ;AX=01FFh=lFF0h/16, CF=0 Пример 3 mov BX,-8 ;BX=FFF8h mov CL,2 sar BX,CL ;BX=FFFEh=-2=-8/4, CF=0 Допустим сдвиг 32-битовых операндов. Допустимо указание числа бит сдвига как с помощью регистра CL, так и непосредственным значением. Максимальная величина сдвига составляет 31 бит. Пример mov EAX,0F0001234h sar EAX,8 EAX=FFF00012h SBB Целочисленное вычитание с займом Команда sbb вычитает второй операнд (источник) из первого (приемника). Результат замещает первый операнд, предыдущее значение которого теряется. Если установлен флаг CF, из результата вычитается еще 1. Таким образом, если команду вычитания записать в общем виде sbb операнд__1, операнд_2 то ее действие можно условно изобразить следующим образом: операнд_1 - операнд_2 - CF -> операнд_1 В качестве первого операнда можно указывать регистр (кроме сегментного) или ячейку памяти, в качестве второго - регистр (кроме сегментного), ячейку памяти или непосредственное значение, однако не допускается определять оба операнда одновременно как ячейки памяти. Операнды могут быть байтами или словами и представлять числа со знаком или без знака. Команда sbb обычно используется для вычитания 32-разрядных чисел. Команда воздействует на флаги OF, SF, ZF, PF и CF. Пример 1 mov AX,76A5h sbb AX,76A3h ;AX=1, если CF был = 1 ;AX=2, если CF был = 0 Пример 2 ; В полях данных: numlow dw 000Ah ;Младшая часть вычитаемого numhigh dw 0001h ;Старшая часть вычитаемого ;Число 1000Ah=65546 ;В программном сегменте: mov AX, 0 ;Младшая часть уменьшаемого mov DX,0002 ;Старшая часть уменьшаемого ;Число 20000h=131072 sub AX, numlow ;Вычитание младших частей. ;AX=FFF6h, CF=1 sbb DX,numhigh ;Вычитание старших частей с ;займом. ;DX:AX=0000:FFF6h=65526 Допустимо использование 32-битовых операндов и дополнительных режимов адресации 32-разрядных процессоров. Пример ;В полях данных: nlow dd 0Ch ;Младшая часть вычитаемого nhi dd 40000000h ;Старшая часть вычитаемого ;Число 400000000000000Ch ;В программном сегменте: mov EAX,0Bh ;Младшая часть уменьшаемого mov EBX,60000000h ;Старшая часть уменьшаемого ;Число 600000000000000Bh sub EAX,nlow ;Вычитание младших частей. ;EAX=FFFFFFFFh, CF=1 sbb EBX,nhi ;Вычитание старших частей с ;займом. EBX=lFFFFFFFh ;Разность IFFFFFFFFFFFFFFFh SCAS Сканирование строки с целью сравнения SCASB Сканирование строки байтов с целью сравнения SCASW Сканирование строки слов с целью сравнения Команды предназначены для операций над строками (строкой называется последовательность байтов или слов памяти с любым содержимым). Они сравнивают содержимое регистра AL (в случае операций над байтами) или АХ (в случае операций над словами) с содержимым ячейки памяти по адресу, находящемуся в паре регистров ESI. Операция сравнения осуществляется путем вычитания содержимого ячейки памяти из содержимого AL или АХ. Результат операции воздействует на регистр флагов, но не изменяет ни один из операндов. Таким образом, операцию сравнения можно условно изобразить следующим образом: АХ или AL - (ESI) ® флаги процессора После каждой операции сравнения регистр DI получает положительное (если флаг DF=0) или отрицательное (если флаг DF=1) приращение. Величина приращения составляет 1 или 2, в зависимости от размера сравниваемых элементов. Вариант команды SCAS имеет формат sсas строка (что не избавляет от необходимости инициализировать регистры ESI адресом строки строка). Замена сегмента строки невозможна. Рассматриваемые команды могут предваряться префиксами повторения repe/repz (повторять, пока элементы равны, т.е. до первого неравенства) и repne/repiiz (повторять, пока элементы не равны, т.е. до первого равенства). В любом случае выполняется не более СХ операций над последовательными элементами. После выполнения рассматриваемых команд регистр DI указывает на ячейку памяти, находящуюся за тем (если DF=0) или перед тем (если DF=1) элементом строки, на котором закончились операции сравнения. Команда воздействует на флаги OF, SF, ZF, AF, PF и CF. Пример 1 ;В полях данных сегмента данных, адресуемого через ES: string db ' /Т:4' ;В программном сегменте: сld ;Поиск вперед по строке lea DI,string ;ESI ® string mov AL, ' ' ;Символ, который мы пропускаем mov CX,8 ;Длина строки repe scasb ;Поиск первого символа, ;отличного от пробела je blank ;Символ не найден - одни пробелы gotit: ;Продолжение, если символ найден В примере 1 в строке имеются символы, отличные от искомого (кода пробела), и команда je выполнена не будет. После завершения сканирования управление будет передано на метку gotit. Содержимое регистров в этой точке: СХ=3 (так как не выполнено сканирование 3 символов), DI = <смещение string> + 5 (выполнено сканирование 5 символов). ES1 указывают на символ строки, следующий за отличным от пробела (в данном случае символ "Т"). Пример 2 ; В полях данных сегмента данных, адресуемого через ES: string db ' /Т:4' ; В программном сегменте: cld ;Поиск вперед по строке lea DI,string ;ESI ® string mov AL, '/' ;Искомый символ mov CX,8 ;Длина строки repne scasb ;Поиск символа / в строке jne blank ;Искомого символа нет g'otit: ;Искомый символ найден В примере 2 в строке имеется искомый символ ("/"), и команда jne выполнена не будет. После завершения сканирования управление будет передано на метку gotit. Содержимое регистров в этой точке: СХ=3 (так как не выполнено сканирование 3 символов), DI = <смещение string> + 5 (выполнено сканирование 5 символов). ESI указывают на символ строки, следующий за найденным знаком "/" (в данном случае символ "Т"). 386+ SCASD Сканирование строки двойных слов с целью сравнения Команда аналогична командам МП 86 scab и scasw, но позволяет сравнивать содержимое расширенного регистра ЕАХ с двойным словом в памяти, адресуемым через регистры ES:EDI. Пример ;В полях данных сегмента данных, адресуемого через ES: nums dd 156000,432666,100000,0,4567890, ... ;В программном сегменте: cld ;Поиск вперед mov DI,offset nums ;ESI -> nums mov EAX,0 ;Искомое число mov CX,10000 ;Максимальное число элементов repne scasd ;Поиск 0 среди чисел массива jne no0 ;Искомого числа нет isO: ;Искомое число найдено В примере в массиве чисел имеется искомое число 0 (с таким же успехом можно было искать любое другое число, например, 4567890). Команда jne выполнена не будет. После завершения сканирования управление будет передано на метку is0. Содержимое регистров в этой точке: СХ уменьшится на 4 (просмотрено 4 элемента), DI будет увеличено на 10h (4 числа по 4 байт в числе). 386+ SETcc Установка байта по условию Команды, обозначаемые (в книгах, не в программах!) SETcc, осуществляют запись в указанный байтовый операнд 1 или 0 в зависимости от одного из 16 условий, определяемых флагами состояния. Если условие ее выполняется, команда записывает в операнд 1; если условие не выполняется - 0.В качестве операнда можно использовать байтовый регистр или 8-битовую ячейку памяти. В составе команд процессора предусмотрены следующие команды условной установки байта: Команда Установить 1, если Условие установки 1 seta выше CF=0 и ZF=0 setae выше или равно CF=0 setb ниже CF= I setbe ниже или равно CF=1 или ZF=1 setc перенос CF=1 sete равно ZF=1 setg больше ZF=0 или SF=OF setge больше или равно SF=OF setl меньше SF не равно OF setle меньше или равно ZF=1 или SF не равно ОР setna не выше CF=1 или ZF=1 setnae не выше и не равно CF=1 setnb не ниже CF=0 setnbe не ниже и не равно CF=0 и ZF=0 setnc нет переноса CF=0 setne не равно ZF=0 setng не больше ZF=1 или SF не равно OF setnge не больше и не равно SF не равно OF setnl не меньше SF=OF setnle не меньше и не равно ZF=0 и SF=OF setno нет переполнения OF=0 setnp нет четности PF=0 setns знаковый бит равен О SF=0 setnz не нуль ZF=0 seto переполнение OF=1 setp есть четность PF=1 setpe сумма битов четная PF=1 setpo сумма битов нечетная PF=0 sets знаковый бит равен SF=1 setz нуль ZF= I Команды, осуществляющие установку по условию "выше - ниже", предназначены для анализа чисел без знака; команды, осуществляющие установку по условию "больше - меньшее", предназначены для анализа чисел со знаком. Пример 1 cmp AX,35h seta CH ;Если AX>35h, CH=1 ;Если AX<=35h, CH=0 Пример 2 ; В полях данных flag db ? ;В программном сегменте test AX,8000h sete flag ;Если в АХ установлен бит 7, ;flag=l. Иначе flag=0 386Р+ SGDT Сохранение в памяти содержимого регистра таблицы глобальных дескрипторов Команда копирует содержимое регистра таблицы глобальных дескрипторов GDTR (линейный базовый адрес таблицы и ее границу) в поле из 6 байт, указанное в качестве операнда. SHL Логический сдвиг влево Команда полностью эквивалентна команде sal (арифметический сдвиг влево). См. описание команды sal. 386+ SHLD Логический сдвиг влево с двойной точностью Трехоперандная команда shld с операндами op1, ор2 и орЗ осуществляет сдвиг влево первого из своих операндов opl. Число битов сдвига определяется третьим операндом орЗ. По мере сдвига операнда opl влево, выдвигаемые из него старшие биты, пройдя через флаг CF, теряются, ; на освобождающиеся места со стороны его младших битов поступают ста |
|
Создано: 26 февраля 2006 01:02 · Личное сообщение · #4 на освобождающиеся места со стороны его младших битов поступают старшие биты второго операнда ор2, как если бы он вдвигался своим левым (старшим) концом в opl. Однако после завершения сдвига значение операнда ор2 не изменяется (рис. П10). Во флаге CF остается последний выдвинутый из операнда opl бит. Максимальное число битов сдвига составляет 31. Рис. П10. Действие команды shld. В качестве первого операнда op1можно указывать 16- или 32-разрядный регистр общего назначения или 16- или 32-битовую ячейку памяти. Вторым операндом ор2 может служить только 16- или 32-разрядный регистр общего назначения. Третий операнд, характеризующий число битов сдвига, может находиться в регистре CL или быть непосредственным значением. Команда воздействует на флаги OF, SF, ZF, PF и CF. Пример 1 mov AX,OC001h mov BX,900Fh shld AX,BX,1 ;AX=8003h, BX=900Fh, CF=1 Пример 2 mov AX,0C001h mov BX,900Fh shld AX,BX,2 ;AX=0006h, BX=900Fh, CF=1 Пример 3 mov AX,0C001h mov BX,900Fh shld AX,BX,3 ;AX=000Ch, BX=900Fh, CF=0 Пример 4 mov EBX,0FFCS000h mov ESI,12340000h mov CL,16 shld EBX,ESI,CL ;EBX=80001234h, ;ESI=12340000h, CF=0 SHR Логический сдвиг вправо Команда shr осуществляет сдвиг вправо всех битов операнда. Младший бит операнда поступает в флаг CF. Если команда записана в формате SHR операнд,1 сдвиг осуществляется на 1 бит. В старший бит операнда загружается 0, а младший теряется. Если команда записана в формате SHR onepand,CL сдвиг осуществляется на число бит, указанное в регистре-счетчике CL, при этом в процессе последовательных сдвигов старшие биты операнда заполняются нулями, а младшие, пройдя через флаг CF, теряются (рис. П11). Рис. П11. Действие команды shr. В качестве операнда можно указывать любой регистр (кроме сегментного) или ячейку памяти размером как в байт, так и в слово. Не допускается использовать в качестве операнда непосредственное значение. Команда воздействует на флаги CF, OF, PF, SF и ZF. Пример 1 mov AL,7 shr AL,1 ;AL=3, CF=1 Пример 2 mov AX, lFF0h mov CL,4 shr AX,CL ;AX=01FFh, CF=0 Пример 3 mov DX,9513h mov CL,8 shr DX,CL ;DX=0095h, CF=0 Допустим сдвиг 32-битовых операндов. Допустимо указание числа бит сдвига как с помощью регистра CL, так и непосредственным значением. Максимальная величина сдвига составляет 31 бит. Пример 1 mov ESI,0FFFF0009h shr ESI,8 ;ESI=00FFFF00h, CF=0 Пример 2 ; В полях данных mem dd 11111111h ;B программном сегменте shr mem,12 ;mem=00011111h, CF=0 386+ SHRD Логический сдвиг вправо с двойной точностью Трехоперандная команда shrd с операндами opl, ор2 и орЗ осуществляет сдвиг вправо первого из своих операндов opl. Число битов сдвига определяется третьим операндом орЗ. По мере сдвига операнда opl вправо выдвигаемые из него младшие биты, пройдя через флаг CF, теряются, а на освобождающиеся места со стороны его старших битов поступают младшие биты второго операнда ор2, как если бы он вдвигался своим правым (младшим) концом в opl. Однако после завершения сдвига значение операнда ор2 не изменяется (рис. П12). Во флаге CF остается последний выдвинутый из операнда opl бит. Максимальное число битов сдвига составляет 31. В качестве первого операнда opl можно указывать 16- или 32-разрядный регистр общего назначения или 16- или 32-битовую ячейку памяти. Вторым операндом ор2 может служить только 16- или 32-разрядный регистр общего назначения. Рис. П12. Действие команды shrd. Третий операнд, характеризующий число битов сдвига, может находиться в регистре CL или быть непосредственным значением. Команда воздействует на флаги OF, SF, ZF, PF и CF. Пример 1 mov AX,0C001h mov BX,900Eh shrd AX,BX,1 ;AX=6000h, BX=900Eh, CF=1 Пример 2 mov AX,0C001h mov BX,900Eh shrd AX,BX,2 ;AX=B000h, BX=900Eh, CF=0 Пример 3 mov AX,0C001h mov BX,900Eh shrd AX,BX,3 ;AX=D800h, BX=900Eh, CF=0 Пример 4 mov EBX,0FFCS000h mov ESI,12345678h mov CL,16 shrd EBX,ESI,CL ;EBX=5678FFC8h, ;ESI=12345678h, CF=0 386P+ SIDT Сохранение в памяти содержимого регистра таблицы дескрипторов прерываний Команда копирует содержимое регистра таблицы дескрипторов прерываний IDTR (линейный базовый адрес таблицы и ее границу) в поле из 6 байт, указанное в качестве операнда. 386Р+ SLDT Сохранение содержимого регистра таблицы локальных дескрипторов Команда копирует содержимое регистра таблицы локальных дескрипторов LDTR (селектор таблицы) в 16- или 32-разрядный регистр или в 16- или 32-битовое поле памяти, указанные в качестве операнда. 386Р+ SMSW Сохранение слова состояния машины Команда smsw считывает слово состояния машины (так называется младшая половина управляющего регистра процессора CRO) и загружает его в указанный в команде 16-разрядный регистр общего назначения или 16-битовое поле памяти. Команду srnsw можно использовать для перевода процессора из реального в защищенный режим или наоборот. В первом случае после чтения слова состояния командой smsw надо установить в нем бит 0 (бит РЕ) и загрузить назад в CRO командой Imsw. Во втором случае после после чтения слова состояния командой smsw надо сбросить в нем бит 0 и загрузить назад в CRO командой Imsw. STC Установка флага переноса Команда stc устанавливает флаг переноса CF в регистре флагов. Команда не имеет параметров и не воздействует на остальные флаги процессора. Пример stc ;Флаг CF устанавливается STD Установка флага направления Команда STD устанавливает флаг направления DF в регистре флагов, определяя тем самым обратное направление выполнения строковых операций (в порядке убывания адресов элементов строки). Команда не имеет параметров и не воздействует на остальные флаги процессора. Пример std ;Флаг направления устанавливается STI Установка флага прерывания Команда STI устанавливает флаг разрешения прерываний IF в регистре флагов, разрешая все аппаратные прерывания (от таймера, клавиатуры, дисков и т.д.). Команда не имеет параметров и не воздействует на остальные флаги процессора. Пример sti ;Разрешение аппаратных прерываний STOS Запись в строку данных STOSB Запись байта в строку данных STOSW Запись слова в строку данных Команды предназначены для операций над строками (строкой называется последовательность байтов или слов памяти с любым содержимым). Они копируют содержимое регистра AL (в случае операций над байтами) или АХ (в случае операций над словами) в ячейку памяти соответствующего размера по адресу, определяемому содержимым пары регистров ESI. После операции копирования регистр DI получает положительное (если флаг DF=0) или отрицательное (если флаг DF=1) приращение. Величина приращения составляет 1 или 2 в зависимости от размера копируемого элемента. Вариант команды stos имеет формат stos строка (что не избавляет от необходимости инициализировать регистры ESI адресом строки строка). Заменить сегментный регистр ES нельзя. Рассматриваемые команды могут предваряться префиксом повторения rep. В этом случае они повторяются СХ раз, заполняя последовательные ячейки памяти одним и тем же содержимым регистра AL или АХ. Команда не воздействует на флаги процессора. Пример 1 ;В полях данных сегмента данных, адресуемого через ES: id db 'ID:' ;В программном сегменте: eld ;Движение по строке вперед mov DI,offset id+3;DI -> за знаком ':' mov AL,'3' ;Код ASCII цифры 3 stosb ;Отправим в строку mov AL,'9' ;Код ASCII цифры 9 stosb ;Отправим в строку ;Теперь в строке id записано 'ID:39' Пример 2 ;В полях данных сегмента данных, адресуемого через ES: array dw 10000 dup (?) ;Место под массив слов ; В программном сегменте: mov AX,-1 ;Число-заполнитель mov CX,10000 ;Заполнить 10000 слов сld ;Движение по строке вперед lea DI,array ;ESI ® array rep stosw ;Bce 10000 элементов массива ;получают значение -1 (FFFFh) Пример 3 ;В полях данных сегмента данных, адресуемого через ES: line db 80 dup (' ') ;Пустая пока строка ;В программном сегменте: mov AL,'>' ;Код ASCII знака '>' mov CX,5 ;Заполнить 5 слов eld ;Движение по строке вперед lea DI,line ;ESI -" line rep stos line ;Первые 5 байт строки line ;заполняются кодом ASCII ;знака ' >' Пример 4 ;В полях данных сегмента данных, адресуемого через ES: line dw 80 dup (0) ;Строка, заполненная нулями ;В программном сегменте: mov AL,'>' ;Код ASCII знака '>' mov AH,31h ;Атрибут (синий по бирюзовому) mov CX,5 ; Заполнить 5 слов сld ;Движение по строке вперед lea DI,line ;ESI -" line rep stos line ;Первые 5 слов строки line ;заполняются кодом ASCII ;знака '>'вместе с атрибутом ;для последующего вывода на экран 386+ STOSD Запись двойного слова в строку данных Команда аналогична командам МП 86 stosb и stosw, но позволяет записать в строку, адресуемую через регистры ES:EDI, двойное слово из регистра ЕАХ. Пример ; В полях данных dat dd 12789,2,550000,100000 ; В программном сегменте mov ЕАХ,444777 push DS pop ES ;ES=DS mov DI, off set dat add DI,4*2 ;DS:SI -" 3-й элемент массива ;чисел stosd ;dat=12789,2,444777,100000 |
|
Создано: 26 февраля 2006 01:03 · Личное сообщение · #5 386P+ STR Сохранение содержимого регистра состояния задачи Команда str копирует содержимое регистра задачи TR (селектор сегмента состояния задачи) в двухбайтовый регистр общего назначения или 16-битовую ячейку памяти, указанные в качестве операнда. SUB Вычитание целых чисел Команда sub вычитает второй операнд (источник) из первого (приемника) и помещает результат на место первого операнда. Исходное значение первого операнда (уменьшаемое) теряется. Таким образом, если команду вычитания записать в общем виде sub операнд_1, операнд_2 то ее действие можно условно изобразить следующим образом: операнд_1 - операнд_2 -> операнд_1 В качестве первого операнда можно указывать регистр (кроме сегментного) или ячейку памяти, в качестве второго - регистр (кроме сегментного), ячейку памяти или непосредственное значение, однако не допускается определять оба операнда одновременно как ячейки памяти. Операнды могут быть байтами или словами и представлять числа со знаком или без знака. Команда воздействует на флаги OF, SF, ZF, AF, PF и CF. Пример 1 mov AX,100 mov BX,60 sub АХ,ВХ ;АХ=40 (АХ-ВХ) , ВХ=60 Пример 2 mov DL, '8 ' mov DH, '0 ' sub DL,DH ;DL=8 (преобразование кода ; ASCII в цифру)) Пример 3 ; ; В полях данных datl dw -168 dat2 dw 10 ; ; В программном сегменте mov AX,data2 sub mem,AX ;mem = -178 Допустимо использование 32-битовых операндов и дополнительных режимов адресации 32-разрядных процессоров. Пример mov EAX,1000000 mov EBX,60000 sub EAX,EBX ;EAX=40000 TEST Логическое сравнение Команда test выполняет операцию логического умножения И над двумя операндами и, в зависимости от результата, устанавливает флаги SF, ZF и PF. Флаги OF и CF сбрасываются, a AF имеет неопределенное значение. Состояние флагов можно затем проанализировать командами условных переходов. Команда test не изменяет ни один из операндов. В качестве первого операнда команды test можно указывать регистр (кроме сегментного) или ячейку памяти, в качестве второго - регистр (кроме сегментного), ячейку памяти или непосредственное значение, однако не допускается определять оба операнда одновременно как ячейки памяти. Операнды могут быть байтами или словами и представлять числа со знаком или без знака. Правила побитового умножения: Первый операнд-бит 0101 Второй операнд-бит 0011 Бит результата 0001 Флаг SF устанавливается в 1, если в результате выполнения команды образовалось число с установленным знаковым битом. Флаг ZF устанавливается в 1, если в результате выполнения команды образовалось число, состоящее из одних двоичных нулей. Флаг PF устанавливается в 1, если в результате выполнения команды образовалось число с четным количеством двоичных единиц в его битах. Пример 1 test AX,1 jne bityes ;Переход, если бит 0 в АХ установлен je bitno ;Переход, если бит 0 в АХ сброшен Пример 2 test SI,8 jne bityes ;Переход, если бит 3 в SI установлен je bitno ;Переход, если бит 0 в АХ сброшен Пример 3 test DX,0FFFFh jz null ;Переход, если DX=0 jnz smth ;Переход, если DX не 0 Пример 4 test CX,0F000h jne bitsyes ;Переход, если какие-либо из ;4 старших битов СХ установлены je bitsno ;Переход, если все 4 старших бита ; СХ сброшены Пример 5 test AX,AX jz zero ;Переход, если АХ=0 jnz notzero ;Переход, если АХ не 0 Допустимо использование 32-битовых операндов и дополнительных режимов адресации 32-разрядных процессоров. Пример test ЕАХ,80000000h jz b31 ;Переход, если бит 31 ЕАХ равен 0 jnz nob31 ;Переход, если бит 31 ЕАХ равен 1 386Р+ VERR Проверка сегмента на чтение Команда verr позволяет определить, разрешено ли чтение из сегмента, за которым закреплен селектор, передаваемый команде в качестве ее операнда. Операндом может служить 16-разрядный регистр общего назначения или 16-битовая ячейка памяти. 386Р+ VERW Проверка сегмента на запись Команда verw позволяет определить, разрешена ли запись в сегмент, за которым закреплен селектор, передаваемый команде в качестве ее операнда. Операндом может служить 16-разрядный регистр общего назначения или 16-битовая ячейка памяти. 486+ XADD Обмен и сложение Команда xadd выполняет в одной операции сложение и обмен операндов. Команда требует двух операндов, причем первый операнд должен быть ячейкой памяти, а второй - регистром. После сложения операндов исходное содержимое памяти переносится во второй операнд (регистр), а полученная сумма записывается в память (на место первого слагаемого) (рис. П13). Команда воздействует на флаги OF, SF, ZF, AF, PF и CF. Рис. П13. Действие команды xadd. Пример ; В полях данных mem dw 99 ;В программном сегменте mov AX,48 xadd mem,AX ;mem=147, AX=99 XCHG Обмен данными между операндами Команда xchg пересылает значение первого операнда во второй, а второго - в первый. В качестве любого операнда можно указывать регистр (кроме сегментного) или ячейку памяти, однако не допускается определять оба операнда одновременно как ячейки памяти. Операнды могут быть байтами или словами и представлять числа со знаком или без знака. Команда не воздействует на флаги процессора. Пример 1 mov AX,OFF01h mov SI,1000h xchg AX,SI ;AX=01000h, SI=FF01h Пример 2 ;В полях данных: mem dw 0F0F0h ;В программном сегменте mov CX,1256h xchg CX,mem ;CX=F0F0h, mem=1256h Пример 3 mov AX,6031h xchg AH,AL ;AX=3160h Допустимо использование 32-битовых операндов и дополнительных режимов адресации 32-разрядных процессоров. Пример xchg ESI,EDI ;ESI и EDI обмениваются содержимым XLAT Табличная трансляция Команда xlat осуществляет выборку байта из массива байтов, который в этом случае называют таблицей трансляции. В регистре ВХ должен находиться относительный адрес таблицы, а в регистре AL - смещение в таблице к выбираемому байту (его индекс). Выбранный байт загружается в регистр AL, замещая находившееся в нем смещение. Длина таблицы может достигать 256 байт. Таблица должна находиться в сегменте данных, адресуемом через сегментный регистр DS. Замена сегмента не допускается. Команда xlat не имеет параметров, но требует предварительной настройки регистров ВХ и AL. Команда не воздействует на флаги процессора. Пример ;Пример демонстрирует преобразование первых 14 скен-кодов ;(фактически это скен-коды клавиш верхнего ряда ;клавиатуры) в коды ASCII соответствующих символов ; В полях данных: table db 0,27, ' 1234567890- = \';Таблица кодов ASCII ;В программном сегменте lea BX,table mov AL,5 ;Скен-код 5 клавиши <4/$> xlat ;AL=34h, код ASCII символа 4 386+ XLAT 386+ XLATB Команда xlatb эквивалентна команде xlat МП 86 за исключением того, что для 32-разрядных приложений относительный адрес таблицы размещается в расширенном регистре ЕВХ. Команда xlat может иметь в качестве операнда относительный адрес таблицы трансляции; в этом случае помещение адреса таблицы в регистр ЕВХ не требуется. Действие команды от этого не изменяется, однако возможна замена сегмента. Пример ;В сегменте, адресуемом через сегментный регистр ES: table db 0,27,'1234567890-=\';Таблица кодов ASCII ;В программном сегменте mov AL,13 ;Скен-код клавиши <=/+> xlat ES:table ;AL=3Dh, код ASCII символа = XOR Логическое ИСКЛЮЧАЮЩЕЕ ИЛИ Команда хог выполняет операцию логического (побитового) ИСКЛЮЧАЮЩЕГО ИЛИ над своими двумя операндами. Результат операции замещает первый операнд; второй операнд не изменяется. Каждый бит результата устанавливается в 1, если соответствующие биты операндов различны, и сбрасывается в 0, если соответствующие биты операндов совпадают. В качестве первого операнда команды хог можно указывать регистр (кроме сегментного) или ячейку памяти, в качестве второго - регистр (кроме сегментного), ячейку памяти или непосредственное значение, однако не допускается определять оба операнда одновременно как ячейки памяти. Операнды могут быть байтами или словами. Команда воздействует на флаги OF, SF, ZF, PF и CF, причем флаги OF и CF всегда сбрасываются, а остальные флаги устанавливаются в зависимости от результата. Правила побитового ИСКЛЮЧАЮЩЕГО ИЛИ: Первый операнд-бит 0101 Второй операнд-бит 0011 Бит результата 0110 Пример 1 mov AX,0Fh хог AX,0FFFFh ;AX=FFF0h Пример 2 хог ВХ,ВХ ;Обнуление ВХ Пример 3 mov SI,0AAAAh mov BX,5555h xor SI,BX ;SI=FFFFh,BX=5555h Допустимо использование 32-битовьгх операндов и дополнительных режимов адресации 32-разрядных процессоров. Пример mov EAX,4444AAAAh xor EAX,4441AAACh ;EAX=00050006h Фу. Всё! |
|
Создано: 26 февраля 2006 12:11 · Личное сообщение · #6 |
<< . 1 . 2 . |
eXeL@B —› Вопросы новичков —› Справочник по командам ассемблера |