Иванова Г.С., Ничушкина Т.Н. - Программирование на ассемблере MASM32 в среде RADAsm с использованием 32-разрядного отладчика OlleDBG, страница 3
Описание файла
PDF-файл из архива "Иванова Г.С., Ничушкина Т.Н. - Программирование на ассемблере MASM32 в среде RADAsm с использованием 32-разрядного отладчика OlleDBG", который расположен в категории "". Всё это находится в предмете "языки интернет-программирования" из 5 семестр, которые можно найти в файловом архиве МГТУ им. Н.Э.Баумана. Не смотря на прямую связь этого архива с МГТУ им. Н.Э.Баумана, его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст 3 страницы из PDF
Укажите, из каких структурных компонентов состоит заготовка программы на ассемблере.Ответ2.Как выполняется запуск программы на ассемблере на выполнение.Ответ3.Какое расширение имеет файл, содержащий объектный код программы?Ответ4.Как определить, к какой команде ассемблера относится сообщение об ошибке?Ответ5.Какая обработка выполняется на этапе компоновки программы?Ответ6.Каким образом в ассемблере объявляются константы и переменные?Ответ7.Какие типы данных при этом можно объявить?Ответ8.От чего зависит размер поля, отводимого под размещаемые данные?Ответ9.Какие типы констант могут быть использованы в качестве инициализаторов?Ответ10.С какой целью используется служебное слово DUP?ОтветОглавление19Лабораторная работа № 2.
Программирование целочисленных вычисленийЦель лабораторной работы – изучение арифметических машинных команд ассемблера, а также функций API, используемых при организации операций ввода и вывода вконсольном режиме.Оглавление201. Форматы машинных команд IA-32Размер машинной команды процессора IA-32 от 1 до 15 байт. Она имеет следующую структуру:гдепрефикс повторения – используется только для строковых команд;префикс размера адреса (67h) – применяется для изменения размера смещения: 16 битпри 32-х разрядной адресации;префикс размера операнда (66h) – указывается, если вместо 32-х разрядного регистрадля хранения операнда используется 16-ти разрядный;префикс замены сегмента – используется при адресации данных любым сегментом кроме DS;d – направление обработки, например, пересылки данных:1 – в регистр, 0 – из регистра;w – размер операнда: 1 – операнды - двойные слова, 0 – операнды - байты;mod – режим: 00 - Disp=0 – смещение в команде 0 байт;01 - Disp=1 – смещение в команде 1 байт;10 - Disp=2 – смещение в команде 2 байта;11 - операнды-регистры.Оглавление21Регистры кодируются в зависимости от размера операнда:w=1regw=0000EAX000AL(r) 001ECX001CL010EDX010DL011EBX011BL100ESP100AH101EBP101CH110ESI110DH111EDI111BHЕсли в команде используется двухбайтовый регистр (например, AX), то перед командой добавляется префикс изменения длины операнда (66h).Различают два вида команд, обрабатывающих операнд в памяти:•команды без байта sib (см.
таблицу 2);•команды, содержащие байт sib (см. таблицу 3).Различаются эти команды по содержимому поля m (r/m): если m≠100, то байт sib вкоманде отсутствует и используется таблица 2.Таблица 2 – Схемы адресации памяти в отсутствии байта SibПолеr/m000B001B010B011B100B101B110B111BЭффективный адрес второго операндаmod = 00Bmod = 01Bmod = 10BEAXECXEDXEBXОпределяется SibDisp321ESIEDIEAX+Disp8ECX+Disp8EDX+Disp8EBX+Disp8Определяется SibSS:[EBP+Disp8]ESI+Disp8EDI+Disp8EAX+Disp32ECX+Disp32EDX+Disp32EBX+Disp32Определяется SibSS:[EBP+Disp32]ESI+Disp32EDI+Disp32Таблица 3 – Схемы адресации памяти при наличии байта SibПолеbase000B001B010B011B100B101Bmod = 00BEAX+ss*indexECX+ss*indexEDX+ss*indexEBX+ss*indexSS:[ESP+ss*index]Disp321+ss*indexЭффективный адрес второго операндаmod = 01Bmod = 10BEAX+ss*index +Disp8ECX+ss*index +Disp8EDX+ss*index +Disp8EBX+ss*index +Disp8SS:[ESP+ ss*index]+Disp8SS:[EBP+ss*index +Disp8]ОглавлениеEAX+ss*index +Disp32ECX+ss*index +Disp32EDX+ss*index +Disp32EBX+ss*index +Disp32SS:[ESP+ ss*index] +Disp32SS:[EBP+ss*index +Disp32]22110B ESI+ss*indexESI+ss*index +Disp8ESI+ss*index +Disp32111B EDI+ss*indexEDI+ss*index +Disp8EDI+ss*index +Disp32ss – масштаб; Index – индексный регистр; Base – базовый регистр;1– особый случай – адрес операнда не зависит от содержимого EBP, а определяется толь-ко смещением в команде (прямая адресация).Примеры:1) movEBX,ECX100010DW Mod Reg Reg10001001811001 0119СB2)movBX,CXпрефикс1 100010DW Mod Reg Reg01100110 10001001663)8119mov001 011CBECX,DS:6[EBX]100010DW Mod Reg Reg См.мл.байт10001011801B4)001 011 000001104movB06CX,DS:6[EBX]префикс 100010DW Mod Reg Reg См.мл.байт0110011061000101165)8mov01B001 011 000001104B06CX,ES:6[EBX]префикс1 префикс2 100010DW Mod Reg Reg См.мл.байт0110011066)001001106mov2610001011801B001 011 000001104B0ECX,6[EBX+EDI*4]100010DW Mod Reg Mem SS Ind Base См.мл.байт100010118B014001 100 10 111 011 00000110CBB06Оглавление6232.
Команды целочисленной арифметики IA-32Процессоры семейства IA-32 поддерживают арифметические операции над однобайтовыми, двухбайтовыми и четырехбайтовыми целыми числами.Размер операндов при этом определяется:• объемом регистра, хранящего число – если хотя бы один операнд находится врегистре;• размером числа, заданным директивой определения данных;•специальными описателями, например, BYTE PTR (байт), WORD PTR (слово) иDWORD PTR (двойное слово), если ни один операнд не находится в регистре и размероперанда отличен от размера, определенного директивой определения данных.1.
Команда пересылки данных – пересылает число размером 1, 2 или 4 байта из источника в приемник:mov Приемник, ИсточникДопустимые варианты:mov reg, regmov mem, regmov reg, memmov mem, immmov reg, immmov r/m16, sregmov sreg, r/m16Примеры:а) mov AX, BXб) mov ESI, 1000в) mov 0[DI], ALг) mov AX, codemov DS, AX2. Команда перемещения и дополнения нулями – при перемещении значение источника помещается в младшие разряды, а в старшие заносятся нули:Оглавление24movzx Приемник, ИсточникДопустимые варианты:movzx r16/r32, r/m8movzx r32, r/m16Примеры:а) movzx EAX, BXб) movzx SI, AH3. Команда перемещения и дополнения знаковым разрядом – команда выполняется аналогично, но в старшие разряды заносятся знаковые биты:movsx Приемник, Источник4. Команда обмена данныхХCHG Операнд1, Операнд 2Допустимые варианты:xchg reg, regxchg mem, regxchg reg, mem5-6. Команды записи слова или двойного слова в стек и извлечения из стекаPUSH imm16 / imm32 / r16 / r32 / m16 / m32POPr16 / r32 / m16 / m32Если в стек помещается 16-ти разрядное значение, то значение ESP:= ESP-2, еслипомещается 32 разрядное значение, то ESP := ESP-4.Если из стека извлекается 16-ти разрядное значение, то значение ESP := ESP+2,если помещается 32 разрядное значение, то ESP := ESP+4.Примеры:pushSIpopword ptr [EBX]8-9.
Команды сложения – складывает операнды, а результат помещает по адресупервого операнда. В отличие от ADD команда ADС добавляет к результату значение битафлага переноса CF.Оглавление25ADD Операнд1, Операнд2ADC Операнд1, Операнд2Допустимые варианты:add reg, regadd mem, regadd reg, memadd mem,immadd reg,imm10-11. Команды вычитания – вычитает из первого операнда второй и результат помещает по адресу первого операнда. В отличие от SUB команда SBB вычитает из результата значение бита флага переноса CF. Допустимые варианты те же, что и у сложения.SUB Операнд1, Операнд2SBB Операнд1, Операнд 213-14.
Команды добавления/вычитания единицыINC reg/memDEC reg/memПримеры:inc AXdec byte ptr 8[EBX,EDI]15-16. Команды умноженияMUL<Операнд2>IМUL <Операнд2>Допустимые варианты:mul/imul r|m8; AX= AL*<Операнд2>mul/imul r|m16 ; DX:AX= AX*<Операнд2>mul/imul r|m32 ; EDX:EAX= EAX*<Операнд2>В качестве второго операнда нельзя указать непосредственное значение!!!Регистры первого операнда в команде не указываются. Местонахождение и длинарезультата операции зависит от размера второго операнда.Оглавление26Пример:mov AX,4imul word ptr A ;DX:AX:=AX*A17-19. Команды «развертывания» чисел – операнды в команде не указываются.Операнд и его длина определяются кодом команды и не могут быть изменены. При выполнении команды происходит расширение записи числа до размера результата посредством размножения знакового разряда.Команды часто используются при программировании деления чисел одинаковойразмерности для обеспечения удвоенной длины делимогоCBW ; байт в слово AL -> AXCWD; слово в двойное слово AX -> DX:AXCDQ; двойное слово в учетверенное EAX -> EDX:EAXCWDE; слово в двойное слово AX -> EAX20-21.
Команды деленияDIV <Операнд2>IDIV <Операнд2>Допустимые варианты:div/idiv r|m8; AL= AX:<Операнд2>, AH - остатокdiv/idiv r|m16 ; AX= (DX:AX):<Операнд2>, DX - остатокdiv/idiv r|m32 ; EAX= (EDX:EAX):<Операнд2>, EDX - остатокВ качестве второго операнда нельзя указать непосредственное значение!!!Пример:mov AX,40cwdidivword ptr A;AX:=(DX:AX):AОглавление273. Пример линейной программыРазработать приложение, вычисляющее X = (A+B)(B-1)/(D+8).(Ниже показан только текст, который добавляется к шаблону.).DATAASWORD 25BSWORD -6DSWORD 11.DATA?XSWORD ?.CODEStart:movCX,DaddCX,8; CX:=D+8movBX,BdecBXmovAX,AaddAX,D; AX:=A+DimulBX; DX:AX:=(A+D)*(B-1)idivCX; AX:=(DX:AX):CXmovX,AX; BX:=B-1.
. .При программировании на ассемблере используется модель памяти Flat. В этой модели считается, что все сегменты программы (кодовый, сегменты данных и стека) начинаются с нулевого адреса и имеют размер, равный доступной памяти компьютера. Такимобразом они как бы накладываются на общее пространство адресов. Реальное разделениеадресного пространства между данными каждого сегмента осуществляется посредствомразмещения программы, данных и стека с различными смещениями относительно началасегментов.Та же модель используется при компиляции программ с языков высокого уровня восновных программных средах (например, Turbo Delphi и Visual C++) , поскольку она существенно упрощает адресацию программы.Оглавление284. Организация ввода-выводаБиблиотека MASM32.lib содержит специальные подпрограммы ввода-вывода консольного режима:1.
Процедура ввода:StdIn PROC lpszBuffer:DWORD, bLen:DWORDПервый операнд – адрес буфера ввода, второй – размер буфера ввода (до 128 байт).В буфере ввода введенная строка завершается символом конца строки (13, 10).2. Процедура замены символов конца строки нулем:StripLF PROC lpszBuffer:DWORD; буфер ввода3. Функция преобразования завершающейся нулем строки в число:atol proc lpszBuffer:DWORD ; результат – в EAXПример программирования ввода:.DATAzaprosDB'Input value:',13,10,0 ; запросbufferDB10 dup ('0'); буфер ввода.CODE.
. .vvod:Invoke StdOut,ADDR zaprosInvoke StdIn,ADDR buffer,LengthOf bufferInvoke StripLF,ADDR buffer; Преобразование в SDWORDInvoke atol,ADDR buffer ;результат в EAX. . .4. Процедура вывода завершающейся нулем строки в окно консоли:StdOut PROC lpszBuffer:DWORD ; буфер вывода, зав. нулем5. Процедура преобразования числа в строку:dwtoa PROC public dwValue:DWORD, lpBuffer:PTR BYTEПример программирования вывода:Оглавление29.DATAresultDWORD ?; поле результатаstringDB13,10,'Result =' ; заголовок выводаresstrDB16 dup (?); выводимое число.CODE.
. .; ПреобразованиеInvoke dwtoa,result,ADDR resstr; ВыводInvoke StdOut,ADDR string. . .Версия программы раздела 3 с вводом-выводом:; Template for console application.586.MODELflat, stdcallOPTION CASEMAP:NONEInclude kernel32.incInclude masm32.incIncludeLib kernel32.libIncludeLib masm32.lib.CONSTMsgExitDB13,10,"Press Enter to Exit",0AH,0DH,0.DATABSWORD -6DSWORD 11XSWORD ?fXSWORD 0ZaprosDB13,10,'Input A',13,10,0ResultDB'Result='ResStrDB16 DUP (' '),0; старшее слово результата.DATA?ASWORD ?Оглавление30fASWORD ?; старшее слово переменной ABufferDB10 DUP (?)inbufDB100 DUP (?).CODEStart:Invoke StdOut,ADDR ZaprosInvoke StdIn,ADDR Buffer,LengthOf BufferInvoke StripLF,ADDR Buffer; Преобразование в SDWORDInvoke atol,ADDR Buffer ;результат в EAXmovDWORD PTR A,EAX; ВычисленияmovCX,DaddCX,8; CX:=D+8movBX,BdecBXmovAX,AaddAX,D; AX:=A+DimulBX; DX:AX:=(A+D)*(B-1)idivCX; AX:=(DX:AX):CXmovX,AX; BX:=B-1; ПреобразованиеInvoke dwtoa,X,ADDR ResStr; ВыводInvoke StdOut,ADDR ResultXOREAX,EAXInvoke StdOut,ADDR MsgExitInvoke StdIn,ADDR inbuf,LengthOf inbufInvoke ExitProcess,0EndStartОглавление31Задание1.