Форум программистов, компьютерный форум, киберфорум
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
Другие темы раздела
Assembler задача для курсовой https://www.cyberforum.ru/ assembler/ thread1000518.html
помогите пожалуйста.не могу найти в интернете ничего что могло бы помочь дан одномерный массив найти количество и сумму нечетных элементов
Assembler masm32 и RadAsm не компилят ничего
Доброго времени суток. Вот такая проблема у меня. Скачал masm32 установил в корень диска С: В notepad забил текст,отдаю команду в командной строке ml /c xxxx.asm получаю файл с расширением .obj Далее...
Assembler Одна непонятная ситуация с отладчиком td
Всем доброго времени суток. У меня небольшая проблема с программой. Заранее говорю, я новичок в этом. Сделал программу которая должна выводить числа на экран в диапазоне от нуля до 99999, короче...
Assembler Правильный выход из программы Поправьте код код пожалуйста, чтобы программа выключалась после нажатия клавиши =) P.S. Компилятор TASM .MODEL small .DATA HelloMessage DB 'Hello, world $' .CODE mov ax,@data mov ds,ax ... https://www.cyberforum.ru/ assembler/ thread995183.html
Assembler Переписать алгоритм на ассемблер https://www.cyberforum.ru/ assembler/ thread994836.html
Есть код на делфи. тема - работа с BitMap. Вопрос: можно ли реализовать это на ассемблер? Это интерполяция изображений. P.s. Важен не сам код, как файл. Вот, то, что нужно ускорить: unit rsmpl;...
Assembler Подпрограмма в ассемблере
Мне необходимо оформить ранее написанную программу как ближнюю подпрограмму. Сама очень плохо разбираюсь. Программа вычисляет средние арифметические четных и нечетных значений элементов массива и...
Ошибка в коде, необходимо разобраться! Assembler
.386 .model flat,stdcall option casemap:none WinMain proto :DWORD,:DWORD,:DWORD,:DWORD include C:\masm32\include\windows.inc include C:\masm32\include\user32.inc include...
Assembler Tasm DosBox Доброго всем времени суток. Нужна ваша помощь: как запустить файл filename.asm в Tasm? файл размещен в d:\tasm. Tasm смонтировал с dosBox-ом: mount c: d:\tasm\bin Буду благодарен. https://www.cyberforum.ru/ assembler/ thread990002.html
Assembler Удобная среда для TASM https://www.cyberforum.ru/ assembler/ thread990000.html
Подскажите инструменты для комфортного изучения Ассемблер под Интел 8086 В данным момент использую DosBox и TASM, но это оочень неудобно, ведь при каждом запуске приходится настраивать, при чем...
Assembler Команда сдвига Сразу скажу, работаю не в ассемблере, а в симуляторе микропроцессора VAX-11. Но все вполне аналогично и можно провести аналогию с ассемблером. Вопрос: Есть команда сдвига, выполняющаяся в формате... https://www.cyberforum.ru/ assembler/ thread989662.html
Ушел с форума
Автор FAQ
14177 / 7061 / 831
Регистрация: 11.11.2010
Сообщений: 12,669
18.12.2013, 13:34  [ТС] 0

Электронный учебник

18.12.2013, 13:34. Просмотров 198158. Ответов 51
Метки (Все метки)

Ответ


ГЛАВА 17
СТРОКОВЫЕ КОМАНДЫ
(часть 2/2)


Кодировка строковых команд
Все строковые команды задаются в виде однобайтового кода pppp-ccc-w, где биты pppp=1010b и задают группу команд, биты ccc задают команду внутри группы (расшифровка в таблице), а бит w определяет размер операнда — байт или слово/двойное/учетверенное слово, в зависимости от установленного режима. Если размер операнда — байт, то опкод инструкции четный (w=0), если размер операнда — слово/двойное слово/учетверенное слово — опкод нечетный (w=1).
hex-bin-кодировкаКоманда
кодировкаppppcccw 
A410100100 MOVSB
A510100101MOVSW/MOVSD/MOVSQ
A610100110 CMPSB
A710100111CMPSW/CMPSD/CMPSQ
AA10101010 STOSB
AB10101011 STOSW/STOSD/STOSQ
AC10101100 LODSB
AD10101101 LODSW/LODSD/LODSQ
AE10101110 SCASB
AF10101111 SCASW/SCASD/SCASQ
Из общей картины выбиваются команды с битами ccc равными 000, 001 и 100, это команды:
000 — mov al/ax/eax,memory offset type byte/word/double word
001 — mov memory offset,al/ax/eax
100 — test al/ax/eax,imm
Префиксы повторения REP/REPE/REPZ/REPNE/REPNZ
(Повторить цепочечную операцию = "REPEAT string operation")
Синтаксис префиксов:
REP
REPE /REPZ
REPNE /REPNZ

Семантика команды: указание условного и безусловного повторения следующей за данной командой цепочечной операции.
Алгоритм работы: алгоритм работы зависит от конкретного префикса.
Префиксы REP, REPE и REPZ на самом деле имеют одинаковый код операции, их действия зависят от той цепочечной команды, которую они предваряют:
REP используется перед любыми цепочечными командами (MOVS, STOS, INS, OUTS). Действия REP:
  1. анализ содержимого CX/ECX:
    • если CX/ECX не равно 0, то выполнить цепочечную команду, следующую за данным префиксом, и перейти к шагу 2;
    • если CX/ECX=0, то передать управление команде, следующей за данной цепочечной командой (выйти из цикла по REP);
  2. уменьшить значение CX/ECX=CX/ECX—1 и вернуться к шагу 1;
Команды REPE и REPZ обычно используются перед цепочечными командами CMPS и SCAS. Действия REPE и REPZ:
  1. анализ содержимого CX/ECX и флага ZF:
    • если CX/ECX≠0 или ZF≠0, то выполнить цепочечную команду, следующую за данным префиксом, и перейти к шагу 2;
    • если CX/ECX=0 или ZF=0, то передать управление команде, следующей за данной цепочечной командой (выйти из цикла по REP);
  2. уменьшить значение CX/ECX=CX/ECX—1 и вернуться к шагу 1;
REPNE и REPNZ также имеют один код операции и имеют смысл при использовании перед цепочечными командами CMPS и SCAS.
Действия REPNE и REPNZ:
  1. анализ содержимого CX/ECX и флага ZF:
    • если CX/ECX≠0 или ZF=0, то выполнить цепочечную команду, следующую за данным префиксом, и перейти к шагу 2;
    • если CX/ECX=0 или ZF≠0, то передать управление команде, следующей за данной цепочечной командой (выйти из цикла по REP);
  2. уменьшить значение CX/ECX=CX/ECX—1 и вернуться к шагу 1.
Применение: команды REP, REPE, REPZ, REPNE и REPNZ в силу специфики своей работы называются префиксами. Они имеют смысл только при использовании со следующими командами: INS, MOVS, OUTS, LOADS, STOS, CMPS и SCAS, заставляя их циклически выполняться и тем самым без организации внешнего цикла обрабатывать последовательности элементов фиксированной длины. Префиксы REPE/REPZ и REPNE/REPNZ являются условными, то есть они прекращают работу цепочечной команды при выполнении определенных условий только с двумя командами — CMPS и SCAS. То есть «REPNE LOADS» работает аналогично «REPE LOADS» и независимо от рода считываемых данных всегда повторяется CX/ECX/RCX раз.
Если префиксы REP/REPE/REPZ и REPNE/REPNZ используется не со строковыми инструкциями они игнорируются.
Поиск конца строки lpStr или определение длины строки
Assembler
1
2
3
4
5
6
7
xor eax,eax
mov edx,offset lpStr; вариант lea edx,lpStr
.while TRUE
mov bl,BYTE PTR[edx+eax]
.break .if bl==0
inc eax
.endw; в eax возвращается длина строки(17 байт)
или так:
Assembler
1
2
3
4
5
6
xor eax,eax
.while TRUE
mov bl,BYTE PTR[eax+lpStr]
.break .if bl==0
inc eax
.endw;(15 байт)
а ещё вот так:
Assembler
1
2
3
4
5
mov esi,offset lpStr;(16 байт)
s_check: lodsb
test al, al
jne s_check
sub esi,offset lpStr+1; в esi возвращается длина строки
и так:
Assembler
1
2
3
4
5
mov edi, offset lpStr;(16 байт)
xor al, al
s_check: scasb
jne s_check
sub edi,offset lpStr+1; в edi возвращается длина строки
или совсем незатейливо:
Assembler
1
2
3
4
5
mov edi, offset lpStr;(14 байт)
xor al, al
or ecx,-1
repne scasb
not ecx; в ecx возвращается длина строки
Кодировка префиксов повторения
Машинная кодировка префиксов повторения
:
0F2h — repne/repnz
0F3h — rep/repe/repz
 7 6 5 4 3 2 1 0
bin1 1 1 1 0 0 1 Z
Бит Z управляет циклом с командами CMPS и SCAS.

Команды загрузки адресных пар в регистры

Использование строковых команд и префиксов повторения позволяет существенно ускорить обработку строк, однако перед этими командами приходится выписывать достаточно много установочных команд (установить флаг направления CLD/STD (под Win32 при старте программы DF всегда равен нулю), записать в регистр CX/ECX/RCX число повторений и т.д.). В определенной мере сократить число таких команд позволяют две команды LDS и LES, которые загружают в регистры адресные пары (указатели) и с помощью которых можно установить пары регистров DS:SI/ESI и ES: DI/EDI на обрабатываемые строки (под Win32 содержимое регистра DS равно содержимому ES).
Команды LDS/LES/LFS/LGS/LSS
(Загрузка указателя с сегментным регистром DS/ES/FS/GS/SS
из памяти = “Load far pointer from memory”)
Синтаксис команд:
LDS <операнд1>,<операнд2>
LES <операнд1>,<операнд2>
LFS <операнд1>,<операнд2>
LGS <операнд1>,<операнд2>
LSS <операнд1>,<операнд2>
Семантика команды: получение полного указателя в виде сегментной составляющей и смещения.
Алгоритм работы: алгоритм работы команды зависит от действующего режима адресации (use16 или use32):
  • если use16, то загрузить первые два байта из ячейки памяти операнда2 в 16-разрядный регистр, указанный операндом1. Следующие два байта в области операнда2 должны содержать сегментную составляющую некоторого адреса; они загружаются в регистр DS/ES/FS/GS/SS;
  • если use32, то загрузить первые четыре байта из ячейки памяти операнда1 в 32-разрядный регистр, указанный операндом2. Следующие два байта в области операнда2 должны содержать сегментную составляющую или селектор, некоторого адреса; они загружаются в регистр DS/ES/FS/GS/SS.
Применение: таким образом, с помощью данных команд в паре регистр DS/ES/FS/GS/SS и регистр-операнд1 оказывается полный адрес некоторой ячейки памяти. Это обстоятельство можно использовать, к примеру, при работе с цепочечными командами, где существуют жесткие соглашения на размещение адресов обрабатываемых строк. Помните, что любая загрузка сегментного регистра приводит к обновлению соответствующего теневого регистра.
Примечание: иногда требуется загрузить сегментный регистр CS (совершение скрытого jmp, переключение из real mode в protected mode и т. д.). Хотя команды LCS не существует — можно выйти из положения, поместив необходимое значение в стек, а затем вызвать команды retf или iret. Микропроцессор i8086 имел недокументированную команду pop cs (опкод 0Fh), но при очередном расширении количества команд 0Fh стали использовать как ID группы команд.

Контрольные вопросы и упражнения
  1. Имеются следующие определения:
    CONAME db ‘SPACE EXPLORERS INC.’
    PRILINE db 20 DUP (‘ ‘)
    Используя цепочечные команды, выполните:
    1. пересылку данных из CONAME в PRILINE слева направо;
    2. пересылку данных из CONAME в PRILINE справа налево;
    3. загрузку третьего и четвертого байтов области CONAME в регистр AX;
    4. сохранение содержимого регистра AX в области по адресу PRILINE+5;
    5. сравнение данных в областях CONAME и PRILINE;
    6. сканирование области CONAME и поиск в ней символа «пробел».
    Если символ будет найден переслать его в регистр BL.
  2. Определите переменную, содержащую шестнадцатеричные значения 03, 04, 05 и B4h. Продублируйте эту переменную 20 раз и выведите результат на экран.
  3. Напишите программу, которая изменит порядок содержимого четырех байт от LIST до LIST+3 на обратный.
  4. Напишите программу, которая пересылает информацию из области с начальным адресом LIST и конечным адресом LIST+100 в область с соответствующими адресами BLK и BLK+100.
  5. Пусть в области от STRING до STRING+99 находится цепочка символов. Необходимо установить в единицу пятый бит регистра DL, если цепочка содержит код цифры; в противном случае этот бит сбрасывается в 0. Постройте схему решения задачи и напишите программу.
  6. Пусть таблица имен начинается с адреса TABLE и состоит из 100 элементов; каждый элемент имеет 80 байт, причем первые 8 байт представляют собой поле имени, а остальные 72 байта являются информационным полем. Напишите программу поиска в таблице заданного имени из 8 символов, хранимого в переменной NAME. Если имя найдено, необходимо скопировать информацию в переменную INFO; в противном случае INFO заполняется пустыми символами (нулевыми байтами).
  7. Напишите программу, которая упаковывает четыре 12-битных величины из четырех смежных слов в три смежных слова.
  8. Напишите процедуру SEARCH, которая отыскивает в массиве заданный байт; в случае успеха параметр-слово содержит индекс элемента в массиве, а в случае неудачи в параметр загружается —1.
  9. Найти сумму массива из десяти 16-битных величин. Первое число хранится по адресу 3000h. Сумма запоминается в стеке.
  10. Сопоставить два массива байтов на идентичность. Длина первого массива указывается по адресу 3000h и далее располагаются сами байты. Длина второго массива указывается по адресу 4000h, далее располагаются сами байты. Если оба массива идентичны, в вершину стека записывается число 0EEEEh, в противном случае число 0000h.


Вернуться к обсуждению:
Электронный учебник
2
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.12.2013, 13:34
Готовые ответы и решения:

Учебник по ассемблеру
Подскажите пожалуйста, ассемблера не знаю вообще, в процессорах тоже мало смыслю (всему научусь)....

Ищу электронный справочник по ассемблеру
Как то давно скачивал в виде экзешника под дос, справочник по ассемблеру. Сейчас у себя не могу...

Электронный учебник
Люди помогите!!! кто может помогите сделать электронный учебник...

Электронный учебник
Здравствуйте! Хотел узнать, Электронный учебник можно создать на PHP, если можно то насколько это...

__________________
Помогаю в написании курсовых работ и дипломов здесь.
51
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.